什麼是非構造函數的繼承
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); //北京, 上海, 香港