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 parseInt 大改造
Sep 27 Javascript
js获取select选中的option的text示例代码
Dec 19 Javascript
网站繁简切换的JS遇到页面卡死的解决方法
Mar 12 Javascript
jQuery插件pagination实现分页特效
Apr 12 Javascript
jQuery支持添加事件的日历特效代码分享(3种样式)
Aug 24 Javascript
jquery实现图片放大镜功能
Nov 23 Javascript
jQuery插件HighCharts实现气泡图效果示例【附demo源码】
Mar 13 Javascript
JS基于正则表达式的替换操作(replace)用法示例
Apr 28 Javascript
Vue之Watcher源码解析(1)
Jul 19 Javascript
基于jstree使用AJAX请求获取数据形成树
Aug 29 Javascript
在React项目中使用Eslint代码检查工具及常见问题
Oct 10 Javascript
JavaScript实现秒杀时钟倒计时
Sep 29 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/03 咖啡文化
如何做到多笔资料的同步
2006/10/09 PHP
PHP 和 MySQL 开发的 8 个技巧
2007/01/02 PHP
解析phpstorm + xdebug 远程断点调试
2013/06/20 PHP
ThinkPHP打开验证码页面显示乱码的解决方法
2014/12/18 PHP
php获取Google机器人访问足迹的方法
2015/04/15 PHP
php支付宝在线支付接口开发教程
2016/09/19 PHP
PHP 断点续传实例详解
2017/11/11 PHP
iframe 父窗口和子窗口相互的调用方法集锦
2010/12/15 Javascript
jQuery针对各类元素操作基础教程
2014/08/29 Javascript
让人蛋疼的JavaScript语法特性
2014/09/30 Javascript
全屏js头像上传插件源码高清版
2016/03/29 Javascript
深入理解JS函数的参数(arguments)的使用
2016/05/28 Javascript
全面解析JavaScript中apply和call以及bind(推荐)
2016/06/15 Javascript
JQuery.validationEngine表单验证插件(推荐)
2016/12/10 Javascript
jQuery中animate的几种用法与注意事项
2016/12/12 Javascript
浅谈Vue初学之props的驼峰命名
2018/07/19 Javascript
JS实现的合并两个有序链表算法示例
2019/02/25 Javascript
Vue登录主页动态背景短视频制作
2019/09/21 Javascript
Vue Render函数创建DOM节点代码实例
2020/07/08 Javascript
JavaScript手写数组的常用函数总结
2020/11/22 Javascript
用Python写的图片蜘蛛人代码
2012/08/27 Python
python迭代dict的key和value的方法
2018/07/06 Python
python微元法计算函数曲线长度的方法
2018/11/08 Python
Python实现的爬取百度贴吧图片功能完整示例
2019/05/10 Python
python数据化运营的重要意义
2019/11/25 Python
opencv 图像加法与图像融合的实现代码
2020/07/08 Python
如何用python批量调整视频声音
2020/12/22 Python
Django后端按照日期查询的方法教程
2021/02/28 Python
平面设计师工作职责范文
2013/12/03 职场文书
机修工工作职责
2014/02/21 职场文书
荆州古城导游词
2015/02/06 职场文书
学校食堂食品安全承诺书
2015/04/29 职场文书
2016年第16个全民国防教育日宣传活动总结
2016/04/05 职场文书
Java Lambda表达式常用的函数式接口
2022/04/07 Java/Android
PostgreSQL逻辑复制解密原理解析
2022/09/23 PostgreSQL