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实现的距离现在多长时间后的一个格式化的日期
Oct 29 Javascript
jQuery toggle()设置CSS样式
Nov 05 Javascript
js实现正方形颜色从下往上升的效果
Aug 04 Javascript
JS限制文本框只能输入数字和字母方法
Feb 28 Javascript
JavaScript获取网页支持表单字符集的方法
Apr 02 Javascript
JS中的THIS和WINDOW.EVENT.SRCELEMENT详解
May 25 Javascript
详解AngularJS脏检查机制及$timeout的妙用
Jun 19 Javascript
jquery实现一个全局计时器(商城可用)
Jun 30 jQuery
快速了解Node中的Stream流是什么
Feb 13 Javascript
在node环境下parse Smarty模板的使用示例代码
Nov 15 Javascript
Javascript查看大图功能代码实现
May 07 Javascript
vue+canvas实现移动端手写签名
May 21 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
Nginx下配置codeigniter框架方法
2015/04/07 PHP
PHP实现的激活用户注册验证邮箱功能示例
2017/06/06 PHP
基于swoole实现多人聊天室
2018/06/14 PHP
PHP PDOStatement::setAttribute讲解
2019/02/01 PHP
laravel框架使用极光推送消息操作示例
2020/02/15 PHP
js程序中美元符号$是什么
2008/06/05 Javascript
javascript 带有滚动条的表格,标题固定,带排序功能.
2009/11/13 Javascript
Extjs实现进度条的两种便捷方式
2013/09/26 Javascript
js调用后台、后台调用前台等方法总结
2014/04/17 Javascript
js如何改变文章的字体大小
2016/01/08 Javascript
深入学习js瀑布流布局
2016/10/14 Javascript
bootstrap表格分页实例讲解
2016/12/30 Javascript
JavaScript控制输入框中只能输入中文、数字和英文的方法【基于正则实现】
2017/03/03 Javascript
ES6学习教程之Map的常用方法总结
2017/08/03 Javascript
移动端触摸滑动插件swiper使用方法详解
2017/08/11 Javascript
swiper.js插件实现pc端文本上下滑动功能示例
2018/12/03 Javascript
vue 之 css module的使用方法
2018/12/04 Javascript
webpack3里使用uglifyjs压缩js时打包报错的解决
2018/12/13 Javascript
vue滚动插件better-scroll使用详解
2019/10/18 Javascript
js实现经典贪吃蛇小游戏
2020/03/19 Javascript
python中正则表达式 re.findall 用法
2018/10/23 Python
图文详解python安装Scrapy框架步骤
2019/05/20 Python
Python datetime包函数简单介绍
2019/08/28 Python
python Event事件、进程池与线程池、协程解析
2019/10/25 Python
python和php哪个容易学
2020/06/19 Python
如何解决python多种版本冲突问题
2020/10/13 Python
python switch 实现多分支选择功能
2020/12/21 Python
大学生开西餐厅创业计划书
2014/02/01 职场文书
公司股权转让协议书
2014/04/12 职场文书
2014大学生中国梦主题教育学习思想汇报
2014/09/10 职场文书
护士长2014年度工作总结
2014/11/11 职场文书
平遥古城导游词
2015/02/03 职场文书
2014年度个人总结范文
2015/03/09 职场文书
2015年清明节演讲稿范文
2015/03/17 职场文书
2016领导干部廉洁自律心得体会
2016/01/13 职场文书
Nginx工作模式及代理配置的使用细节
2022/03/21 Servers