比如現在有乙個物件「人」
var person =
還有乙個物件「職位」
var position =
怎麼才能讓職位去繼承人,也就是說我怎麼才能生成中國程式設計師的物件
要注意,這兩個物件都是普通物件,不是建構函式,無法使用建構函式方法重現繼承
json格式的發明人douglas crockford,提出了乙個object()函式,可以做到這一點
function object(o);
f.prototype = o;
return new f();
}
這個object()函式,其實只做一件事,就是把子物件的prototype屬性,只想物件,從而使得子物件與父物件連在一起。
使用的時候,第一步現在父物件的基礎上,生成子物件。
var position = object(person);
然後,再加上子物件本省的屬性
position.name = '程式設計師';
這時,子物件已經繼承了父物件的屬性了
alert(position.nation);//中國
除了使用prototype鏈以外,還有另一種思路:把物件的屬性,全部拷貝給子物件,也能實現繼承。
下面這個函式就是在做淺拷貝:
function extendcopy(p);
for(var i in p)
c.uber = p;
return c;
}
使用
var position = extendcopy(person);
position.name = '程式設計師';
alert(position.nation);//中國
但是,這樣的拷貝有乙個問題。那就是,如果父物件的屬性等於陣列或另乙個物件,那麼實際上,自物件獲得的只是乙個記憶體位址,而不是真正的拷貝,因此存在父物件被篡改的可能。
現在給person新增乙個省份,它的值是陣列
person.province = ['山東','北京','上海','哈爾濱'];
通過extendcopy()函式,position繼承了person。
var position = extendcopy(person);
然後,我沒讓你為position的省份新增乙個城市:
position.province.push('四川');
結果person的省份也被改了
alert(position.province);//山東,北京,上海,哈爾濱,四川
alert(person.province);//山東,北京,上海,哈爾濱,四川
所以,extendcopy()只是拷貝基本資料型別的資料,我們把這種拷貝叫做「淺拷貝」。這是最早期jquery實現繼承的方法。
所謂的深拷貝,就是能夠實現真正意義上的陣列和物件的拷貝,它的實現並不難,只要遞迴呼叫淺拷貝就行了。
function deepcopy(p.c);
for(var i in p);
deepcopy(p[i],c[i]);
}else
}return c;
}
使用
var position = deepcopy(person);
現在,給父物件加乙個屬性,值為陣列,然後再子物件修改這個屬性
person.province = ['山東','上海','北京'];
position.province.push('廈門');
這是父物件就不會受到影響了。
alert(position.province);//山東,上海,北京,廈門
alert(person.province);//山東,上海,北京
目前,jquery庫就使用的就是這種繼承方法。 js 非建構函式實現繼承 深拷貝
非建構函式的繼承 深度拷貝 var chinese for var i in p deepcopy p i c i else c i p i return c var doctor deepcopy chinese 現在,給父物件加乙個屬性,值為陣列。然後,在子物件上修改這個屬性 chinese.b...
建構函式的繼承
在父類中定義了2個建構函式,在子類中,也定義了2個建構函式。當執行子類時,可以發現先呼叫父類的建構函式,在呼叫子類的建構函式。實驗四 建構函式的繼承 實驗內容 在父類中,定義了2個建構函式,在子類中,也定義了2個建構函式。編寫 程式顯示父類 子類建構函式的呼叫過程,在子類中實現建構函式的繼承。pac...
建構函式的繼承
物件之間的 繼承 有五種方法。比如,現在有乙個 動物 物件的建構函式。function animal 還有乙個 貓 物件的建構函式。function cat name,color 怎樣才能使 貓 繼承 動物 呢?一 建構函式繫結 function cat name,color var cat1 ne...