[Js++开发历程] Javascript 不完整的继承
1.4 Javascript 不完整的继承
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原型链)
- Javascript开发笔记:不完整的继承
- javascript教程之不完整的继承(js原型链)
- JavaScript 定义类的最佳写法——完整支持面向对象(封装、继承、多态),兼容所有浏览器,支持用JSDuck生成文档
- 【JavaScript】前端开发框架三剑客—AngularJS VS. Backone.js VS.Ember.js
- JavaScript个人笔记:js模块化开发seajs基础
- Flask MVVM 开发(vue.js),Javascript 处理时间
- iOS开发 - Swift使用JavaScriptCore与JS交互
- Node.js / JavaScript后端开发指引
- CentOS 7 配置JS语言开发环境(JavaScript)
- 完整的JavaScript开发堆栈:MEAN
- 前端开发必须知道的JS(一) 原型和继承
- 现代 JavaScript 开发编程风格Idiomatic.js指南中文版
- JS 面试知识学习历程(第八天) -- JS开发环境
- [原生js] 前端开发必须掌握的七个JavaScript技巧
- javascript开发技术大全-第3章 js数据类型
- [js插件开发教程]实现一个比较完整的开源级选项卡插件
- Android混合开发之WebViewJavascriptBridge实现JS与java安全交互
- JavaScript程序开发(八)—js语法之数据类型
- javascript中js的引入位置和js的书写格式对程序执行顺序的影响(开发笔记)