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 相关文章推荐
jquery创建并行对象或者合并对象的实现代码
Oct 10 Javascript
用js调用迅雷下载代码的二种方法
Apr 15 Javascript
jQuery中each()、find()和filter()等节点操作方法详解(推荐)
May 25 Javascript
js实现消息滚动效果
Jan 18 Javascript
JS实现控制图片显示大小的方法【图片等比例缩放功能】
Feb 18 Javascript
JS中使用 after 伪类清除浮动实例
Mar 01 Javascript
浅谈Node.js之异步流控制
Oct 25 Javascript
详解如何从零开始搭建Express+Vue开发环境
Jul 17 Javascript
JS常见构造模式实例对比分析
Aug 27 Javascript
微信小程序Echarts图表组件使用方法详解
Jun 25 Javascript
Vue 数组和对象更新,但是页面没有刷新的解决方式
Nov 09 Javascript
uniapp开发小程序的经验总结
Apr 08 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 万年历实现代码
2012/10/18 PHP
学习YUI.Ext 第六天--关于树TreePanel(Part 2异步获取节点)
2007/03/10 Javascript
Javascript 中文字符串处理额外注意事项
2009/11/15 Javascript
Jquery 插件学习实例1 插件制作说明与tableUI优化
2010/04/02 Javascript
jquery插件制作 手风琴Panel效果实现
2012/08/17 Javascript
javascript读写XML实现广告轮换(兼容IE、FF)
2013/08/09 Javascript
javascript打印html内容功能的方法示例
2013/11/28 Javascript
遍历DOM对象内的元素属性示例代码
2014/02/08 Javascript
页面刷新时记住滚动条的位置jquery代码
2014/06/17 Javascript
JS获取时间的方法
2015/01/21 Javascript
JS实现表单中checkbox对勾选中增加边框显示效果
2015/08/21 Javascript
JavaScript实现复制内容到粘贴板代码
2016/03/31 Javascript
微信小程序 特效菜单抽屉效果实例代码
2017/01/11 Javascript
快速掌握jQuery插件开发
2017/01/19 Javascript
vue ssr 指南详读
2018/06/29 Javascript
elementUI Tree 树形控件的官方使用文档
2019/04/25 Javascript
微信小程序tabBar 返回tabBar不刷新页面
2019/07/25 Javascript
如何使用Jquery动态生成二级选项列表
2020/02/06 jQuery
[13:55]Newbee vs Team Spirit
2018/06/07 DOTA
在阿里云服务器上配置CentOS+Nginx+Python+Flask环境
2016/06/18 Python
在java中如何定义一个抽象属性示例详解
2017/08/18 Python
Python数据可视化正态分布简单分析及实现代码
2017/12/04 Python
Python3 jupyter notebook 服务器搭建过程
2018/11/30 Python
python redis连接 有序集合去重的代码
2019/08/04 Python
python3 反射的四种基本方法解析
2019/08/26 Python
Python处理PDF与CDF实例
2020/02/26 Python
python打包多类型文件的操作方法
2020/09/21 Python
LN-CC英国:伦敦时尚生活的缩影
2019/09/01 全球购物
学生会干部自荐信
2014/02/04 职场文书
带病坚持工作事迹
2014/05/03 职场文书
2014年幼儿园保育工作总结
2014/12/02 职场文书
2015年社区文体活动总结
2015/03/25 职场文书
东京审判观后感
2015/06/01 职场文书
2016年圣诞节活动总结范文
2016/04/01 职场文书
在Spring-Boot中如何使用@Value注解注入集合类
2021/08/02 Java/Android
进行数据处理的6个 Python 代码块分享
2022/04/06 Python