JavaScript中原型链继承的问题
来源:互联网 发布:象棋教学软件 编辑:程序博客网 时间:2024/05/16 06:21
若单独使用原型链来实现继承,会存在引用类型在所有子类中共享的问题。
function SuperType(){ this.name=['hello'];// 数组为一种引用类型 } function SubType(){ } SubType.prototype=new SuperType(); var sub=new SubType(); var sub1=new SubType(); console.log(sub.name);// hello sub.name.push(' world'); console.log(sub1.name);// hello world console.log(sub.name);// hello world
通过程序运行的结果来看,虽然只是在sub
这一个实例中修改了name
属性的值,但是 在另一个实例sub1
中,name
的属性值也发生了改变。
具体原因是因为name是引用类型,所有的name
都指向同一块内存空间,所以一次改变就会引起全局改变,相当于其他语言的静态变量。
但是如果不是引用类型就不存在这种问题,每创建一个实例,都会为每个实例的name
属性重新分配一个内存空间,相互之间不干扰。
function SuperType1(){ this.name='hello'; } function SubType1(){ } SubType1.prototype=new SuperType1(); var sub=new SubType1(); var sub1=new SubType1(); console.log(sub.name);// hello sub.name='hello world'; console.log(sub1.name);// hello console.log(sub.name);//hello world
另外,就算给name
刚开始赋值为String类型,由于后期的字符串操作函数返回的都只是一个字符串而不是一个String的引用类型,所以导致name
本身类型的改变(不再是引用类型),不会引起子类共享的问题。
function SuperType1(){ var hel=new String('hello'); this.name=hel; } function SubType1(){ } SubType1.prototype=new SuperType1(); var sub=new SubType1(); var sub1=new SubType1(); console.log(sub.name);// sub.name=sub.name.toUpperCase(); console.log(sub.name instanceof String);//false,不再是String类型 console.log(sub1.name);// console.log(sub.name);//
程序运行结果如下
参考资料:JavaScript高级程序设计(第三版)第6章
0 0
- JavaScript中原型链继承的问题
- javascript中继承(一)-----原型链继承的个人理解
- javascript中继承(一)-----原型链继承的个人理解
- JavaScript的继承--原型链
- JavaScript中继承(一)-- 原型链
- JavaScript的原型继承
- JavaScript的原型继承
- javascript原型链继承
- javascript原型链继承
- JavaScript:原型链、继承
- javascript 原型链继承
- JavaScript 继承---原型链
- JavaScript的只继承于原型链
- JavaScript原型链继承的对比
- JavaScript的封装,继承 | 原型链
- javascript原型继承中this
- javascript中的原型(prototype)及原型链的继承方式
- javascript中的原型(prototype)及原型链的继承方式
- Cookie与Session的区别
- Ceph增量备份import diff export diff代码串讲
- MiniGui使用ttf失量字库支持中英文
- 解决OutOfMemoryError: PermGen space tomcat内存溢出,屡试不爽
- 防火墙导致vmware和windows ping不通
- JavaScript中原型链继承的问题
- 20161215随笔
- ScrollerView 布局
- ios 蓝色文件夹和黄色文件夹的区别
- 虚拟"云服务器",达到远程设备间信息数据交互
- Jackson 框架,轻易转换JSON
- 虚拟机安装Oracle Linux 6.6,启动进不了登录界面
- Kotlin语法(十九)-内联函数(Inline Functions)
- Android运行环境Dalvik模式和ART模式的区别