javascript教程之不完整的继承(js原型链)
Javascript的继承和标准的oop继承有很大的区别,Javascript的继承是采用原型链的技术,每个类都会将“成员变量”和“成员函数”放到prototype上,Js++都过superclass将其链接起来,即C.prototype.superclass=C.superclass=P.prototype;
当varc=newC()时,c.__proto__=C.prototype;
当c访问“成员变量”时,如果在__proto__无法获取时,就会到C.prototype查找,如果又不存在,又会到父类的prototype查找,由于只有__proto__是对象创建时分配的(每个对象独立分配),其他都是定义时分配的(每个对象共享),此时,如果访问C.prototype中“成员变量”是对象时,不修改“成员变量”的本身,而是修改“成员变量”对象的成员时,修改的“成员变量”对象的成员就会被所有对象实例共享,这样就违背类设计的初衷。
例如:
"package".j(function(){
"classA".j(function(){
jpublic({
v:{a:1}
});
jprivate({
p:{a:1}
});
jprotected({
x:{a:1}
});
});
"classBextendsA".j(function(){
});
});
varb1=newB();
b1.v.a=5;
b1.x.a=5;
varb2=newB();
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刷LeetCode模板技巧篇(二)
- javascript正则表达式 教程_js正则表达式匹配字符串
- Memlab,一款分析 JavaScript 堆并查找浏览器和 Node.js 中内存泄漏的开源框架
- [javascript] 看知乎学习js事件触发过程详解编程语言
- JavaScript实现MySQL数据库查询(js查询mysql数据库)
- 利用 JS 实现 Redis 的连接(js连接redis)
- JS实时链接Oracle让数据库访问更便捷(js实时连接oracle)
- JavaScript探索之旅掌握Oracle和JS的完美融合(js与oracle)
- 使用Oracle和JS开发新一代应用仿真世界(oracle js)
- 深入认识JavaScript中的函数
- javascript延时重复执行函数lLoopRun.js
- JavaScript入门教程(4)js浏览器对象
- JavaScript入门教程(9)Document文档对象
- 克隆javascript对象的三个方法小结
- 远离JS灾难css灾难之js私有函数和css选择器作为容器
- Javascript绝句欣赏一些经典的js代码
- Javascript异步加载详解(浏览器在javascript的加载方式)
- javascript学习笔记(二)js一些基本概念
- JavaScript高级程序设计阅读笔记(十六)javascript检测浏览器和操作系统-detect.js
- javascript表单验证-Parsley.js使用和配置
- js获取url参数代码实例分享(JS操作URL)
- Javascript浮点数乘积运算出现多位小数的解决方法
- Javascript模块化编程详解
- JavaScript和CSS交互的方法汇总
- 浅谈JavaScript函数节流