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 相关文章推荐
js indexOf()定义和用法
Oct 21 Javascript
无缝滚动js代码通俗易懂(自写)
Jun 19 Javascript
js中array的sort()方法使用介绍
Feb 20 Javascript
js 与 php 通过json数据进行通讯示例
Mar 26 Javascript
JavaScript模拟实现继承的方法
Mar 30 Javascript
详解Javascript模板引擎mustache.js
Jan 20 Javascript
Vue 固定头 固定列 点击表头可排序的表格组件
Nov 25 Javascript
非常实用的vue导航钩子
Mar 20 Javascript
node.js中cluster的使用教程
Jun 09 Javascript
微信小程序 页面跳转事件绑定的实例详解
Sep 20 Javascript
JavaScript解析机制与闭包原理实例详解
Mar 08 Javascript
基于js判断浏览器是否支持webGL
Apr 18 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排序算法之希尔排序(Shell Sort)实例分析
2018/04/20 PHP
PHP SESSION机制的理解与实例
2019/03/22 PHP
jQuery插件slick实现响应式移动端幻灯片图片切换特效
2015/04/12 Javascript
Markdown+Bootstrap图片自适应属性详解
2016/05/21 Javascript
JS动态给对象添加事件的简单方法
2016/07/19 Javascript
利用jquery获取select下拉框的值
2016/11/23 Javascript
利用JQuery阻止事件冒泡
2016/12/01 Javascript
AngularJS自定义控件实例详解
2016/12/13 Javascript
详解webpack-dev-server 设置反向代理解决跨域问题
2018/04/18 Javascript
javascriptvoid(0)含义以及与"#"的区别讲解
2019/01/19 Javascript
axios+Vue实现上传文件显示进度功能
2019/04/14 Javascript
Node.js安装详细步骤教程(Windows版)详解
2019/09/01 Javascript
JavaScript中的类型检查
2020/02/03 Javascript
vue+iview框架实现左侧动态菜单功能的示例代码
2020/07/23 Javascript
Vue基于iview table展示图片实现点击放大
2020/08/05 Javascript
Openlayers实现图形绘制
2020/09/28 Javascript
python超简单解决约瑟夫环问题
2015/05/12 Python
Python实现高效求解素数代码实例
2015/06/30 Python
python 回调函数和回调方法的实现分析
2016/03/23 Python
python async with和async for的使用
2019/06/20 Python
python抓取多种类型的页面方法实例
2019/11/20 Python
python 实现视频 图像帧提取
2019/12/10 Python
pytorch实现特殊的Module--Sqeuential三种写法
2020/01/15 Python
Python 实现敏感目录扫描的示例代码
2020/05/21 Python
python如何实现读取并显示图片(不需要图形界面)
2020/07/08 Python
CSS3 选择器 伪类选择器介绍
2012/01/21 HTML / CSS
儿科护理实习自我鉴定
2013/09/19 职场文书
触摸春天教学反思
2014/02/03 职场文书
《青蛙看海》教学反思
2014/04/23 职场文书
校园广播稿100字
2014/10/06 职场文书
安全生产奖惩制度
2015/08/06 职场文书
《桂花雨》教学反思
2016/02/19 职场文书
预备党员的思想汇报,你真的会写吗?
2019/06/28 职场文书
nginx搭建图片服务器的过程详解(root和alias的区别)
2021/03/31 Servers
Python制作表白爱心合集
2022/01/22 Python
nginx之内存池的实现
2022/06/28 Servers