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 相关文章推荐
用JS操作FRAME中的IFRAME及其内容的实现代码
Jul 26 Javascript
在页面上用action传递参数到后台出现乱码的解决方法
Dec 31 Javascript
JQuery包裹DOM节点的方法
Jun 11 Javascript
jQuery+AJAX实现无刷新下拉加载更多
Jul 03 Javascript
超漂亮的jQuery图片轮播特效
Nov 24 Javascript
JavaScript 模块的循环加载实现方法
Dec 13 Javascript
js如何判断输入字符串长度
Dec 16 Javascript
微信小程序 视图容器组件的详解及实例代码
Jan 19 Javascript
React-Native使用Mobx实现购物车功能
Sep 14 Javascript
echarts设置图例颜色和地图底色的方法实例
Aug 01 Javascript
js判断一个对象是数组(函数)的方法实例
Dec 19 Javascript
vue的$http的get请求要加上params操作
Nov 12 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/05/08 PHP
php从给定url获取文件扩展名的方法
2015/03/14 PHP
thinkPHP中分页用法实例分析
2015/12/26 PHP
JavaScript 判断浏览器是否支持SVG的代码
2013/03/21 Javascript
jquery实现二级导航下拉菜单效果
2015/12/18 Javascript
JS中如何实现复选框全选功能
2016/12/19 Javascript
详解微信小程序 template添加绑定事件
2017/06/23 Javascript
解决vue-cli + webpack 新建项目出错的问题
2018/03/20 Javascript
JS加密插件CryptoJS实现AES加密操作示例
2018/08/16 Javascript
微信小程序实现复选框效果
2018/12/28 Javascript
教你完全理解ReentrantLock重入锁
2019/06/03 Javascript
微信小程序实现拖拽功能
2019/09/26 Javascript
[46:44]VG vs TNC Supermajor小组赛B组败者组决赛 BO3 第一场 6.2
2018/06/03 DOTA
pyv8学习python和javascript变量进行交互
2013/12/04 Python
Python定时执行之Timer用法示例
2015/05/27 Python
全面理解Python中self的用法
2016/06/04 Python
python入门教程之识别验证码
2017/03/04 Python
Python格式化输出%s和%d
2018/05/07 Python
Python字典生成式、集合生成式、生成器用法实例分析
2020/01/07 Python
Python hashlib常见摘要算法详解
2020/01/13 Python
python误差棒图errorbar()函数实例解析
2020/02/11 Python
基于Tensorflow的MNIST手写数字识别分类
2020/06/17 Python
Python如何设置指定窗口为前台活动窗口
2020/08/12 Python
美国知名玩具品牌:Melissa & Doug
2016/08/16 全球购物
应届生护士求职信
2013/11/01 职场文书
职业生涯规划书的格式
2013/12/29 职场文书
百度吧主申请感言
2014/01/12 职场文书
村长贪污检举信
2014/04/04 职场文书
校长寄语大全
2014/04/09 职场文书
投资合作协议书范本
2014/04/17 职场文书
童年读书笔记
2015/06/26 职场文书
Python中快速掌握Data Frame的常用操作
2021/03/31 Python
mysql中int(3)和int(10)的数值范围是否相同
2021/10/16 MySQL
Java 数组的使用
2022/05/11 Java/Android
Redis高并发缓存架构性能优化
2022/05/15 Redis
服务器SVN搭建图文安装过程
2022/06/21 Servers