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 相关文章推荐
不一样的文字闪烁 轮番闪烁
Nov 11 Javascript
js时间比较示例分享(日期比较)
Mar 05 Javascript
js使用cookie记录用户名的方法
Nov 26 Javascript
jquery延迟对象解析
Oct 26 Javascript
JavaScript实现滑动导航栏效果
Aug 30 Javascript
详解vue.js根据不同环境(正式、测试)打包到不同目录
Jul 13 Javascript
react native 获取地理位置的方法示例
Aug 28 Javascript
详解Vue 全局变量,局部变量
Apr 17 Javascript
浅谈小程序globalData的那些事儿
Nov 01 Javascript
24行JavaScript代码实现Redux的方法实例
Nov 17 Javascript
js仿360开机效果
Dec 26 Javascript
Js图片点击切换轮播实现代码
Jul 27 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
收听困难?教您超简便短波广播抗干扰方法!
2021/03/01 无线电
ThinkPHP 连接Oracle数据库的详细教程[全]
2012/07/16 PHP
解决PhpStorm64不能启动的问题
2020/06/20 PHP
JavaScript 小型打飞机游戏实现原理说明
2010/10/28 Javascript
网页编辑器ckeditor和ckfinder配置步骤分享
2012/05/24 Javascript
Jvascript学习实践案例(开发常用)
2012/06/25 Javascript
JQuery中form验证出错信息的查看方法
2013/10/08 Javascript
谈谈AngularJs中的隐藏和显示
2015/12/09 Javascript
Bootstrap表单布局样式代码
2016/05/31 Javascript
javascript和jQuery实现网页实时聊天的ajax长轮询
2016/07/20 Javascript
AngularJS通过$location获取及改变当前页面的URL
2016/09/23 Javascript
微信小程序 石头剪刀布实例代码
2017/01/04 Javascript
jQuery插件扩展操作入门示例
2017/01/16 Javascript
Bootstrap table 实现树形表格联动选中联动取消功能
2019/09/30 Javascript
Vue 实现输入框新增搜索历史记录功能
2019/10/15 Javascript
vue2.0 watch里面的 deep和immediate用法说明
2020/10/30 Javascript
[01:37]DOTA2超级联赛专访ChuaN 传奇般的电竞之路
2013/06/19 DOTA
用Python进行一些简单的自然语言处理的教程
2015/03/31 Python
python装饰器深入学习
2018/04/06 Python
Python实现获取邮箱内容并解析的方法示例
2018/06/16 Python
浅析Python 3 字符串中的 STR 和 Bytes 有什么区别
2018/10/14 Python
python线程里哪种模块比较适合
2020/08/02 Python
Python logging自定义字段输出及打印颜色
2020/11/30 Python
详解Python调用系统命令的六种方法
2021/01/28 Python
Python爬虫+Tkinter制作一个翻译软件的示例
2021/02/20 Python
描述一下JVM加载class文件的原理机制
2013/12/08 面试题
怎样创建、运行java程序
2014/08/01 面试题
物流仓管员工作职责
2014/01/06 职场文书
大学生会计职业生涯规划范文
2014/02/28 职场文书
实习公司领导推荐函
2014/05/21 职场文书
乡镇精神文明建设汇报材料
2014/08/15 职场文书
出差报告格式模板
2014/11/06 职场文书
第28个世界无烟日活动总结
2015/02/10 职场文书
2015年新教师个人工作总结
2015/10/14 职场文书
2016年秋季运动会广播稿
2015/12/21 职场文书
Redis高并发防止秒杀超卖实战源码解决方案
2021/11/01 Redis