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 27 Javascript
javascript事件问题
Sep 05 Javascript
ExtJS下grid的一些属性说明
Dec 13 Javascript
FileUpload 控件 禁止手动输入或粘贴的实现代码
Apr 07 Javascript
js获取URL的参数的方法(getQueryString)示例
Sep 29 Javascript
创建js对象和js类的方法汇总
Dec 24 Javascript
javascript处理a标签超链接默认事件的方法
Jun 29 Javascript
轻松实现JavaScript图片切换
Jan 12 Javascript
jquery中用jsonp实现搜索框功能
Oct 18 Javascript
以v-model与promise两种方式实现vue弹窗组件
May 21 Javascript
js字符串类型String常用操作实例总结
Jul 05 Javascript
解决mui框架中switch开关通过js控制开或者关状态时小圆点不动的问题
Sep 03 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返回当前日期或者指定日期是周几
2015/05/21 PHP
php 在字符串指定位置插入新字符的简单实现
2016/06/28 PHP
php自定义函数实现二维数组按指定key排序的方法
2016/09/29 PHP
Laravel 微信小程序后端实现用户登录的示例代码
2019/11/26 PHP
获取css样式表内样式的js函数currentStyle(IE),defaultView(FF)
2011/02/14 Javascript
自己动手制作jquery插件之自动添加删除行的实现
2011/10/13 Javascript
JQuery操作iframe父页面与子页面的元素与方法(实例讲解)
2013/11/20 Javascript
JS中的数组的sort方法使用示例
2014/01/22 Javascript
jQuery实用函数用法总结
2014/08/29 Javascript
JavaScript模拟重力状态下抛物运动的方法
2015/03/03 Javascript
jQuery $.each遍历对象、数组用法实例
2015/04/16 Javascript
javascript实现十秒钟后注册按钮可点击的方法
2015/05/13 Javascript
使用AngularJS中的SCE来防止XSS攻击的方法
2015/06/18 Javascript
浅谈jquery拼接字符串效率比较高的方法
2017/02/22 Javascript
开发Vue树形组件的示例代码
2017/12/21 Javascript
详解Vue中watch对象内属性的方法
2019/02/01 Javascript
nuxt框架中对vuex进行模块化设置的实现方法
2019/09/06 Javascript
详解javascript中var与ES6规范中let、const区别与用法
2020/01/11 Javascript
vue列表数据发生变化指令没有更新问题及解决方法
2020/01/16 Javascript
JavaScript对象字面量和构造函数原理与用法详解
2020/04/18 Javascript
在vue中实现给每个页面顶部设置title
2020/07/29 Javascript
uni-app使用countdown插件实现倒计时
2020/11/01 Javascript
[01:03:36]DOTA2-DPC中国联赛 正赛 VG vs Magma BO3 第二场 1月26日
2021/03/11 DOTA
python实现批量下载新浪博客的方法
2015/06/15 Python
基于Python的PIL库学习详解
2019/05/10 Python
python 将字符串中的数字相加求和的实现
2019/07/18 Python
python中matplotlib实现随鼠标滑动自动标注代码
2020/04/23 Python
瑜伽服装品牌:露露柠檬(lululemon athletica)
2017/06/04 全球购物
阿里巴巴美国:Alibaba美国
2019/11/24 全球购物
德国户外商店:eXXpozed
2020/07/25 全球购物
表扬信格式
2014/01/12 职场文书
大学生推广普通话演讲稿
2014/09/21 职场文书
舞蹈社团活动总结
2015/05/07 职场文书
总结会主持词
2015/07/02 职场文书
《夹竹桃》教学反思
2016/02/23 职场文书
mybatis 获取无数据的字段不显示的问题
2021/07/15 Java/Android