Javascript开发笔记:不完整的继承
2014-01-07 15:47
337 查看
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中“成员变量”是对象时,不修改“成员变量”的本身,而是修改“成员变量”对象的成员时,修改的“成员变量”对象的成员就会被所有对象实例共享,这样就违背类设计的初衷。
例如:
如何解决此问题了?
A. 将 v 这样的成员“成员变量”(其本身是对象)不在原型链上定义,而是在构造函数中调用,此时,创建对象实例时,就会在对象的__proto__上分配。
Js++提供了类似的方法,只要在jprivate中定义的“成员变量”或“成员函数”都会分配到对象的__proto__上,且只有本实例可用, jprotected中定义的“成员变量”(其本身是对象)也会分配到对象的__proto__上,且只有继承他的可用,
B. 原型链上只定义只读的“成员变量”(其本身是对象)
C.jpublic 定义的“成员变量”(其本身是对象)中的成员,只是只读成员,切记不可赋值,否则会在各个实例中共享。
每个类都会将“成员变量”和“成员函数”放到 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 框架开发笔记 [三] 自定义HTML对像的扩展与继承
- 【Visual C++】游戏开发笔记十六 讲解一个完整的回合制游戏demo
- JDE报表开发笔记(数据选择及继承)
- 记录: 游戏开发笔记十六 讲解一个完整的回合制游戏demo
- Arcgis Javascript API 开发笔记
- JavaScript继承学习笔记
- ArcGIS API for javascript开发笔记(二)——解决ArcGIS Service中的服务在内网环境下无法进行javascript预览问题
- ArcGIS API for javascript开发笔记(三)——解决打印输出的中文为乱码问题
- 《JavaScript 设计模式与开发实战》第一部分(1、2、3章)笔记
- ArcGIS API for javascript开发笔记(四)——GP服务调用之GP模型的规范化制作详解
- Android开发笔记-最快Android模拟器Genymotion的安装与使用完整教程(多图,慎点)
- JavaScript 定义类的最佳写法——完整支持面向对象(封装、继承、多态),兼容所有浏览器,支持用JSDuck生成文档
- Android开发笔记(一百五十一)WebView与JavaScript交互的四种形式
- 【Visual C++】游戏开发笔记十六 讲解一个完整的回合制游戏demo
- ArcGIS API for javascript开发笔记(六)——REST详解及如何使用REST API调用GP服务
- javascript面向对象学习笔记(一)——继承
- Arcgis Javascript API 开发笔记
- Javascript学习笔记(Object 对象与继承)
- JavaScript高级程序设计之面向对象的程序设计之继承之寄生组合式继承第6.3.6讲笔记
- 【学习笔记javascript设计模式与开发实践(代理模式)----6】