您的位置:首页 > Web前端 > JavaScript

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); //北京, 上海, 香港
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐