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 相关文章推荐
关于取不到由location.href提交而来的上级页面地址的解决办法
Jul 30 Javascript
将json当数据库一样操作的javascript lib
Oct 28 Javascript
js获得网页背景色和字体色的方法
Mar 21 Javascript
JavaScript控制各种浏览器全屏模式的方法、属性和事件介绍
Apr 03 Javascript
使用jQuery异步加载 JavaScript脚本解决方案
Apr 20 Javascript
jquery实现聚光灯效果的方法
Feb 06 Javascript
JavaScript利用HTML DOM进行文档操作的方法
Mar 28 Javascript
javascript 面向对象实战思想分享
Sep 07 Javascript
3种vue路由传参的基本模式
Feb 22 Javascript
vue如何解决循环引用组件报错的问题
Sep 22 Javascript
vue 出现data-v-xxx的原因及解决
Aug 04 Javascript
jQuery实现简单三级联动效果
Sep 05 jQuery
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
thinkphp3.2中Lite文件替换框架入口文件或应用入口文件的方法
2015/05/21 PHP
PHP在弹框中获取foreach中遍历的id值并传递给地址栏
2017/06/13 PHP
jQuery 注意事项 与原因分析
2009/04/24 Javascript
不同的jQuery API来处理不同的浏览器事件
2012/12/09 Javascript
jQuery实现页面滚动时层智能浮动定位实例探讨
2013/03/29 Javascript
jquery的相对父元素和相对文档定位示例代码
2013/08/02 Javascript
JS验证身份证有效性示例
2013/10/11 Javascript
js 判断所选时间(或者当前时间)是否在某一时间段的实现代码
2015/09/05 Javascript
JS代码实现根据时间变换页面背景效果
2016/06/16 Javascript
BootStrap Validator 版本差异问题导致的submitHandler失效问题的解决方法
2016/12/01 Javascript
JavaScript控制输入框中只能输入中文、数字和英文的方法【基于正则实现】
2017/03/03 Javascript
vue router学习之动态路由和嵌套路由详解
2017/09/21 Javascript
使用vue-router为每个路由配置各自的title
2018/07/30 Javascript
使用js实现将后台传入的json数据放在前台显示
2018/08/06 Javascript
微信小程序使用swiper组件实现层叠轮播图
2018/11/04 Javascript
ES6中let、const的区别及变量的解构赋值操作方法实例分析
2019/10/15 Javascript
jQuery cookie的公共方法封装和使用示例
2020/06/01 jQuery
详解vue中v-on事件监听指令的基本用法
2020/07/22 Javascript
简单介绍Python中的JSON模块
2015/04/08 Python
python删除列表中重复记录的方法
2015/04/28 Python
Python语言的变量认识及操作方法
2018/02/11 Python
在python带权重的列表中随机取值的方法
2019/01/23 Python
pycharm运行程序时看不到任何结果显示的解决
2020/02/21 Python
Pandas DataFrame求差集的示例代码
2020/12/13 Python
伦敦一卡通:The London Pass
2018/11/30 全球购物
L*SPACE官网:比基尼、泳装和度假服装
2019/03/18 全球购物
介绍一下SQL中union,intersect和minus
2012/04/05 面试题
什么是重载?CTS、CLS和CLR分别做何解释
2012/05/06 面试题
abstract 可以和 virtual 一起使用吗?可以和 override 一起使用吗?
2012/10/15 面试题
建筑工程自我鉴定
2013/10/18 职场文书
服装设计师职业生涯规划范文
2014/02/28 职场文书
公司试用期员工自我评价
2014/09/17 职场文书
优秀党员先进事迹材料
2014/12/18 职场文书
通知书大全
2015/04/27 职场文书
地震捐款简报
2015/07/21 职场文书
从贫穷到富有,是知识技能和学习力的差别
2019/08/20 职场文书