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插入动态样式实现代码
Feb 22 Javascript
运用JQuery的toggle实现网页加载完成自动弹窗
Mar 18 Javascript
JavaScript charCodeAt方法入门实例(用于取得指定位置字符的Unicode编码)
Oct 17 Javascript
javascript中活灵活现的Array对象详解
Nov 30 Javascript
通过修改360抢票的刷新频率和突破8车次限制实现方法
Jan 04 Javascript
微信小程序 Template详解及简单实例
Jan 05 Javascript
使用jquery判断一个元素是否含有一个指定的类(class)实例
Feb 12 Javascript
jquery动态赋值id与动态取id方法示例
Aug 21 jQuery
使用bootstrap实现下拉框搜索功能的实例讲解
Aug 10 Javascript
了解前端理论:rscss和rsjs
May 23 Javascript
javascript实现点亮灯泡特效示例
Oct 15 Javascript
Node.js API详解之 vm模块用法实例分析
May 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
php MessagePack介绍
2013/10/06 PHP
php实现的日历程序
2015/06/18 PHP
CentOS7系统搭建LAMP及更新PHP版本操作详解
2020/03/26 PHP
强制设为首页代码
2006/06/19 Javascript
JQuery 选项卡效果(JS与HTML的分离)
2010/04/01 Javascript
Javascript 拖拽雏形(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
js实现横向百叶窗效果网页切换动画效果的方法
2015/03/02 Javascript
js阻止浏览器默认行为的简单实例
2016/05/15 Javascript
Angularjs 实现分页功能及示例代码
2016/09/14 Javascript
Boostrap实现的登录界面实例代码
2016/10/09 Javascript
使用json来定义函数,在里面可以定义多个函数的实现方法
2016/10/28 Javascript
基于jQuery和Bootstrap框架实现仿知乎前端动态列表效果
2016/11/09 Javascript
JavaScript 中使用 Generator的方法
2017/12/29 Javascript
JavaScript实现五子棋游戏的方法详解
2019/07/08 Javascript
JavaScript实现抖音罗盘时钟
2019/10/11 Javascript
webpack 动态批量加载文件的实现方法
2020/03/19 Javascript
[03:17]DOTA2-DPC中国联赛1月29日Recap集锦
2021/03/11 DOTA
详解Python中用于计算指数的exp()方法
2015/05/14 Python
Python中列表的一些基本操作知识汇总
2015/05/20 Python
python字典基本操作实例分析
2015/07/11 Python
TensorFLow用Saver保存和恢复变量
2018/03/10 Python
python3连接MySQL数据库实例详解
2018/05/24 Python
使用Python爬虫库BeautifulSoup遍历文档树并对标签进行操作详解
2020/01/25 Python
TensorFlow实现保存训练模型为pd文件并恢复
2020/02/06 Python
pycharm如何实现跨目录调用文件
2020/02/28 Python
使用keras2.0 将Merge层改为函数式
2020/05/23 Python
python 实现两个npy档案合并
2020/07/01 Python
最简单的matplotlib安装教程(小白)
2020/07/28 Python
Pycharm编辑器功能之代码折叠效果的实现代码
2020/10/15 Python
python不同版本的_new_不同点总结
2020/12/09 Python
你可能不熟练的十个前端HTML5经典面试题
2018/07/03 HTML / CSS
优质服务活动实施方案
2014/05/02 职场文书
酒店客房服务员岗位职责
2015/04/09 职场文书
学校教学工作总结2015
2015/05/19 职场文书
车间班组长竞聘书
2015/09/15 职场文书
JavaScript中document.activeELement焦点元素介绍
2021/11/27 Javascript