js面向对象3:非构造函数的继承
2019-08-01 16:42
54 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/crushh_fun/article/details/97935788
什么是非构造函数的继承
A:
var Chinese={ nation:'中国' }
B:
var Doctor={ career:'医生' }
如何让B继承A呢?
也就是说如何生成一个“中国医生”的对象。
object()方法
funciton object(o){ // object函数就是让子对象的prototype属性指向父对象, // 从而使得子对象与父对象连在一起。 function F() {}; F.prototype=o; return new F(); } var Doctor=object(Chinese);//在父对象的基础上生成子对象 Doctor.career='医生'; //将职业属性给Doctor加上 alert(Doctor.nation);//中国
浅拷贝
将父对象的属性都拷贝给子对象
function extendCopy(p){ var c={}; for(var i in p){ c[i]=p[i]; } return c; } var Doctor=extendCopy(Chinese); Doctor.career='医生'; alert(Doctor.nation); // 中国
但是这样做有一个隐患,如果父对象的属性是一个数组或者一个对象时,子对象拷贝只是拿到内存地址,这就使得父对象存在被篡改的可能性,如:
Chinese.birthPlaces=['上海','北京','江西']; var Doctor=extendCopy(Chinese); Doctor.birthPlaces.push('厦门'); alert(Doctor.birthPlaces); //北京, 上海, 香港, 厦门 alert(Chinese.birthPlaces); //北京, 上海, 香港, 厦门
extendCopy()只是拷贝基本类型的数据,我们把这种拷贝叫做"浅拷贝"。这是早期jQuery实现继承的方式。
深拷贝
function deepCopy(p,c){ var c=c||{}; for(var i in p){ if(typeof p[i]=== 'object'){ c[i]=(p[i].constructor===Array)?[]:{}; deepCopy(p[i],c[i]); }else{ c[i]=p[i]; } } return c; } var Docotr=deepCopy(Chinese); Chinese.birthPlaces=['上海','北京','江西']; Doctor.birthPlaces.push('厦门'); alert(Doctor.birthPlaces); //北京, 上海, 香港, 厦门 alert(Chinese.birthPlaces); //北京, 上海, 香港
相关文章推荐
- js面向对象小结(工厂模式,构造函数,原型方法,继承)
- js--面向对象--构造函数的继承
- Js面向对象漫谈(2) 继承--原型链,借用构造函数,组合式,寄生式, 寄生组合式
- js--面向对象--非构造函数的继承
- js面向对象(构造函数与继承)
- JS面向对象---构造函数之间的继承(阮一峰网络日志学习笔记)
- JS面向对象---非构造函数之间的继承(阮一峰网络日志学习笔记)
- JS 面向对象之继承 -- 借用构造函数
- js面向对象之构造函数、封装与继承
- 学JS面向对象 以及里面的继承
- js1:对象的学习,构造函数,继承构造函数【使用教材:JavaScript深度剖析第2版】
- 02-面向对象(继承-子父类中的构造函数-子类的实例化过程-细节) 02-面向对象(继承-子父类中的构造函数-子类的实例化过程-细节)2 02-面向对象(继承-子父类中的构造函数-子类的实例化
- JS面向对象(3)之Object类,静态属性,闭包,私有属性, call和apply的使用,继承的三种实现方法
- JavaScript面向对象(三)——继承与闭包、JS实现继承的三种方式
- js面向对象(json对象、继承、面向对象拖拽)
- 面向对象JS基础讲解,工厂模式、构造函数模式、原型模式、混合模式、动态原型模式
- js面向对象的继承--拷贝,类式继承,原型继承
- js面向对象 继承
- JS面向对象编程(二):构造函数的继承理解
- js面向对象之封装(构造函数)