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系列(14) 作用域链介绍(Scope Chain)
Apr 12 Javascript
js验证模型自我实现的具体方法
Jun 21 Javascript
页面实时更新时间的JS实例代码
Dec 18 Javascript
基于jquery实现发送文章到手机的代码
Dec 26 Javascript
js淡入淡出的图片轮播效果代码分享
Aug 24 Javascript
jQuery插件zTree实现更新根节点中第i个节点名称的方法示例
Mar 08 Javascript
JavaScript基于activexobject连接远程数据库SQL Server 2014的方法
Jul 12 Javascript
vue-cli3.0使用及部分配置详解
Aug 29 Javascript
详解在Angular4中使用ng2-baidu-map的方法
Jun 19 Javascript
关于vue3默认把所有onSomething当作v-on事件绑定的思考
May 15 Javascript
vuecli3.x中轻松4步带你使用tinymce的步骤
Jun 25 Javascript
k8s node节点重新加入master集群的实现
Feb 22 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企业级应用之常见缓存技术篇
2011/01/27 PHP
PHP文件打开、关闭、写入的判断与执行代码
2011/05/24 PHP
PHP编程中的Session阻塞问题与解决方法分析
2017/08/07 PHP
PHP判断是否是微信打开还是浏览器打开的方法
2019/02/27 PHP
浅析PHP 中move_uploaded_file 上传中文文件名失败
2019/04/17 PHP
弹出广告特效(一个IP只弹出一次)的代码
2007/07/27 Javascript
用jquery方法操作radio使其默认选项是否
2013/09/10 Javascript
Ajax局部更新导致JS事件重复触发问题的解决方法
2014/10/14 Javascript
node.js中的fs.lstatSync方法使用说明
2014/12/16 Javascript
javascript中定义类的方法汇总
2014/12/28 Javascript
浏览器中url存储的JavaScript实现
2015/07/07 Javascript
vue结合axios与后端进行ajax交互的方法
2018/07/06 Javascript
vue3.0 CLI - 2.5 - 了解组件的三维
2018/09/14 Javascript
jquery实现的分页显示功能示例
2019/08/23 jQuery
layui use 定义js外部引用函数的方法
2019/09/26 Javascript
js将URL网址转为16进制加密与解密函数
2020/03/04 Javascript
ES6对象操作实例详解
2020/05/23 Javascript
[01:03:42]VP vs VGJ.S 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Python基于DES算法加密解密实例
2015/06/03 Python
python去除文件中重复的行实例
2018/06/29 Python
Python画柱状统计图操作示例【基于matplotlib库】
2018/07/04 Python
浅析Python函数式编程
2018/10/06 Python
浅谈python中get pass用法
2019/03/19 Python
python flask安装和命令详解
2019/04/02 Python
使用Windows批处理和WMI设置Python的环境变量方法
2019/08/14 Python
基于python的opencv图像处理实现对斑马线的检测示例
2020/11/29 Python
Hunkemöller瑞士网上商店:欧洲最大的内衣品牌之一
2018/12/03 全球购物
90后毕业生的求职信范文
2013/09/21 职场文书
求职者简历中的自我评价
2013/10/20 职场文书
大学生活动策划方案
2014/02/10 职场文书
中餐厅经理岗位职责
2014/04/11 职场文书
高一学生期末评语
2014/04/25 职场文书
活动总结格式
2014/08/30 职场文书
2014年安全工作总结范文
2014/11/13 职场文书
面试复试通知单
2015/04/24 职场文书
python使用pymysql模块操作MySQL
2021/06/16 Python