javascript教程之不完整的继承(js原型链)


Posted in Javascript onJanuary 13, 2014

Javascript的继承和标准的oop继承有很大的区别,Javascript的继承是采用原型链的技术,每个类都会将“成员变量”和“成员函数”放到 prototype 上,Js++都过superclass将其链接起来,即 C.prototype.superclass = C.superclass = P.prototype;
当 var c = new C()时,c.__proto__ = C.prototype ;
当 c访问“成员变量”时,如果在__proto__无法获取时,就会到C.prototype查找,如果又不存在,又会到父类的prototype查找,由于只有 __proto__ 是对象创建时分配的(每个对象独立分配),其他都是定义时分配的(每个对象共享),此时,如果访问C.prototype中“成员变量”是对象时,不修改“成员变量”的本身,而是修改“成员变量”对象的成员时,修改的“成员变量”对象的成员就会被所有对象实例共享,这样就违背类设计的初衷。
例如:

'package'.j(function () {
        'class A'.j(function () {
            jpublic({
                v:{a: 1}
            });
            jprivate({
                p:{a:1}
            });
            jprotected({
                x:{a:1}
            });
        });
        'class B extends A'.j(function () {
        });
});
var b1 = new B();
b1.v.a = 5;
b1.x.a = 5;
var b2 = new B();
console.log(b1.v.a) // 输出为 5
console.log(b1.x.a) // 输出为 5
console.log(b2.v.a) // 输出也为 5,并不是预想的 1
console.log(b2.x.a) // 输出为 1
console.log(b2.p.a) // 不可用,会提示 p不存在

如何解决此问题?
A. 将 v 这样的成员“成员变量”(其本身是对象)不在原型链上定义,而是在构造函数中调用,此时,创建对象实例时,就会在对象的__proto__上分配。

Js++提供了类似的方法,只要在jprivate中定义的“成员变量”或“成员函数”都会分配到对象的__proto__上,且只有本实例可用, jprotected中定义的“成员变量”(其本身是对象)也会分配到对象的__proto__上,且只有继承他的可用,

B. 原型链上只定义只读的“成员变量”(其本身是对象)

C.jpublic 定义的“成员变量”(其本身是对象)中的成员,只是只读成员,切记不可赋值,否则会在各个实例中共享。

Javascript 相关文章推荐
Jquery进度条插件 Progress Bar小问题解决
Jul 12 Javascript
imgAreaSelect 中文文档帮助说明
Oct 08 Javascript
IE8下Jquery获取select选中的值post到后台报错问题
Jul 02 Javascript
JS在可编辑的div中的光标位置插入内容的方法
Nov 20 Javascript
实例解析jQuery插件EasyUI最常用的表单验证规则
Nov 29 Javascript
JS实现颜色动态淡化效果
Mar 06 Javascript
提高Node.js性能的应用技巧分享
Aug 10 Javascript
vue的基本用法与常见指令
Aug 15 Javascript
js获取html页面代码中图片地址的实现代码
Mar 05 Javascript
jQuery扩展方法实现Form表单与Json互相转换的实例代码
Sep 05 jQuery
js实现弹幕飞机效果
Aug 27 Javascript
微信小程序自定义yPicker组件实现省市区三级联动功能
Oct 29 Javascript
javascript函数作用域学习示例(js作用域)
Jan 13 #Javascript
多选列表框动态添加,移动,删除,全选等操作的简单实例
Jan 13 #Javascript
鼠标经过tr时,改变tr当前背景颜色
Jan 13 #Javascript
js导航栏单击事件背景变换示例代码
Jan 13 #Javascript
JS文本获得焦点清除文本文字的示例代码
Jan 13 #Javascript
javascript间隔定时器(延时定时器)学习 间隔调用和延时调用
Jan 13 #Javascript
parentElement,srcElement的使用小结
Jan 13 #Javascript
You might like
理解PHP中的stdClass类
2014/04/18 PHP
Yii2中OAuth扩展及QQ互联登录实现方法
2016/05/16 PHP
thinkPHP框架实现的短信接口验证码功能示例
2018/06/20 PHP
PDO::errorCode讲解
2019/01/28 PHP
PHP正则表达式笔记与实例详解
2019/05/09 PHP
thinkphp3.2同时连接两个数据库的简单方法
2019/08/13 PHP
JQuery index()方法使用代码
2010/06/02 Javascript
javascript级联下拉列表实例代码(自写)
2013/05/10 Javascript
javascript内置对象arguments详解
2014/03/16 Javascript
ExtJS中设置下拉列表框不可编辑的方法
2014/05/07 Javascript
jQuery中insertAfter()方法用法实例
2015/01/08 Javascript
基于jQuery实现文本框只能输入数字(小数、整数)
2016/01/14 Javascript
利用BootStrap的Carousel.js实现轮播图动画效果
2016/12/21 Javascript
AngularJS constant和value区别详解
2017/02/28 Javascript
详解基于node的前端项目编译时内存溢出问题
2017/08/01 Javascript
微信小程序下拉刷新界面的实现
2017/09/28 Javascript
angular4实现tab栏切换的方法示例
2017/10/21 Javascript
React中如何引入Angular组件详解
2018/08/09 Javascript
搭建Vue从Vue-cli到router路由护卫的实现
2019/11/14 Javascript
在vue中实现echarts随窗体变化
2020/07/27 Javascript
python+matplotlib绘制简单的海豚(顶点和节点的操作)
2018/01/02 Python
python实现自动发送邮件发送多人、群发、多附件的示例
2018/01/23 Python
Python之用户输入的实例
2018/06/22 Python
Python字典中的键映射多个值的方法(列表或者集合)
2018/10/17 Python
python实现连连看游戏
2020/02/14 Python
python mock测试的示例
2020/10/19 Python
在Pycharm中安装Pandas库方法(简单易懂)
2021/02/20 Python
白宫黑市官网:White House Black Market
2016/11/17 全球购物
Book Depository澳大利亚:世界领先的专业在线书店之一
2018/12/27 全球购物
啤酒销售实习自我鉴定
2013/09/24 职场文书
求职信的最佳写作思路
2014/02/01 职场文书
地震捐款倡议书
2014/08/29 职场文书
2015年精神文明建设工作总结
2015/04/21 职场文书
2015年护士长个人工作总结
2015/04/24 职场文书
学校开除通知书
2015/04/25 职场文书
人民检察院起诉书
2015/05/20 职场文书