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 相关文章推荐
Javascript 类与静态类的实现
Apr 01 Javascript
js使用eval解析json(js中使用json)
Jan 17 Javascript
兼容所有浏览器的js复制插件Zero使用介绍
Mar 19 Javascript
jQuery学习笔记之jQuery构建函数的7种方法
Jun 03 Javascript
JavaScript中的原型和继承详解(图文)
Jul 18 Javascript
jquery-tips悬浮提示插件分享
Jul 31 Javascript
jQuery插件zTree实现删除树节点的方法示例
Mar 08 Javascript
详解如何在vue中使用sass
Jun 21 Javascript
vue登录注册及token验证实现代码
Dec 14 Javascript
详解Node使用Puppeteer完成一次复杂的爬虫
Apr 18 Javascript
vue2.0 自定义组件的方法(vue组件的封装)
Jun 05 Javascript
获取layer.open弹出层的返回值方法
Aug 20 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中获取指定IP的物理地址的代码(正则表达式)
2011/06/23 PHP
基于PHP字符串的比较函数strcmp()与strcasecmp()的使用详解
2013/05/15 PHP
php header功能的使用
2013/10/28 PHP
php关联数组快速排序的方法
2015/04/17 PHP
PHP7生产环境队列Beanstalkd用法详解
2020/05/19 PHP
PHP类的自动加载与命名空间用法实例分析
2020/06/05 PHP
javascript 尚未实现错误解决办法
2008/11/27 Javascript
js弹出的对话窗口永远保持居中显示
2012/12/15 Javascript
JavaScript打印网页指定区域的例子
2014/05/03 Javascript
jquery 插件实现多行文本框[textarea]自动高度
2015/03/04 Javascript
jQuery可见性过滤选择器用法示例
2016/09/09 Javascript
工厂模式在JS中的实践
2017/01/18 Javascript
基于jQuery Ajax实现下拉框无刷新联动
2017/12/06 jQuery
angularJS1 url中携带参数的获取方法
2018/10/09 Javascript
如何使用CSS3和JQuery easing 插件制作绚丽菜单
2019/06/18 jQuery
react antd表格中渲染一张或多张图片的实例
2020/10/28 Javascript
[00:38]TI珍贵瞬间系列(二):笑
2020/08/26 DOTA
举例区分Python中的浅复制与深复制
2015/07/02 Python
Python基于回溯法子集树模板解决数字组合问题实例
2017/09/02 Python
详解K-means算法在Python中的实现
2017/12/05 Python
使用django-crontab实现定时任务的示例
2018/02/26 Python
Python使用pymysql从MySQL数据库中读出数据的方法
2018/07/25 Python
Python3批量生成带logo的二维码方法
2019/06/24 Python
PyTorch的深度学习入门之PyTorch安装和配置
2019/06/27 Python
Python split() 函数拆分字符串将字符串转化为列的方法
2019/07/16 Python
Win10 安装PyCharm2019.1.1(图文教程)
2019/09/29 Python
Pandas中DataFrame交换列顺序的方法实现
2020/12/14 Python
使用CSS3的font-face字体嵌入样式的方法讲解
2016/05/13 HTML / CSS
详解CSS透明opacity和IE各版本透明度滤镜filter的最准确用法
2016/12/20 HTML / CSS
药学专业个人的自我评价
2013/12/31 职场文书
母亲节感恩寄语
2014/02/21 职场文书
诚实守信道德模范事迹材料
2014/08/15 职场文书
2014年实习期工作总结
2014/11/27 职场文书
小升初自荐信怎么写
2015/03/26 职场文书
python 利用PyAutoGUI快速构建自动化操作脚本
2021/05/31 Python
Python实现单例模式的5种方法
2021/06/15 Python