一、構造函數綁定
使用call或apply方法,將父對象的構造函數綁定在子對象上,即在子對象構造函數中加一行。Animal.apply(this, arguments);
二、prototype模式
Cat.prototype = new Animal();
Cat.prototype.constructor = Cat; //糾回prototype對象的constructor值
三、直接繼承
function Animal(){ }
Animal.prototype.species = "動物";
將Cat的prototype對象,然后指向Animal的prototype對象,這樣就完成了繼承
Cat.prototype = Animal.prototype;
Cat.prototype.constructor = Cat;
與前一種方法相比,這樣做的優點是效率比較高(不用執行和建立Animal的實例了),比較省內存。缺點是 Cat.prototype和Animal.prototype現在指向了同一個對象,那么任何對Cat.prototype的修改,都會反映到Animal.prototype。
四、非構造函數的繼承
1、使用object()方法
function object(o) {
function F() {}
F.prototype = o;
return new F();
}
var Doctor = object(Chinese);
2、淺拷貝
把父對象的屬性,全部拷貝給子對象,也能實現繼承。
function extendCopy(p) {
var c = {};
for (var i in p) {
c[i] = p[i];
}
c.uber = p;
return c;
}
var Doctor = extendCopy(Chinese);
Doctor.career = '醫生';
alert(Doctor.nation); // 中國
這樣的拷貝有一個問題。那就是,如果父對象的屬性等于數組或另一個對象,那么實際上,子對象獲得的只是一個內存地址,而不是真正拷貝,因此存在父對象被篡改的可能。
3、深拷貝
所謂"深拷貝",就是能夠實現真正意義上的數組和對象的拷貝。它的實現并不難,只要遞歸調用"淺拷貝"就行了。
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;
}
//更改子對象不會影響父對象。
js-繼承
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
推薦閱讀更多精彩內容
- 這個系列的第一部分,主要介紹了如何"封裝"數據和方法,以及如何從原型對象生成實例。 今天要介紹的是,對象之間的"繼...