將函數原型複製到另一個函數(如下所示)有什麼危害。原型繼承:將函數原型複製到另一個
function Person(){}
Person.prototype = {};
function Author(){}
Author.prototype = Person.prototype;
將函數原型複製到另一個函數(如下所示)有什麼危害。原型繼承:將函數原型複製到另一個
function Person(){}
Person.prototype = {};
function Author(){}
Author.prototype = Person.prototype;
JS中的對象分配創建一個引用。
var o = {};
var c = o;
現在兩個物體o
和c
指的是相同的對象。試圖將一個對象的原型分配給另一個時,同樣的規則適用。
Author.prototype = Person.prototype;
現在既Author
和Person
的原型是指一個單獨的對象。如果你將一些數據放在Author
的原型屬性中,那麼Person也會有相同的數據。對於不同的對象來說,這是最不可能的
一個這樣做的正確方法是
Author.prototype = Object.create(Person.prototype);
在這裏,您創建Author.prototype
一個全新的對象 - 但Person
對象繼承。
因爲您通過引用傳遞原型,這意味着兩者都受到所有更改的影響。考慮:
function Person(){}
Person.prototype = {};
function Author(){}
Author.prototype = Person.prototype;
Author.prototype.books = [];
var bob = new Person();
console.log(bob.books); // this will be an empty array, not undefined as one would expect.
附着方法爲原型的理想方法是通過創建其通過實例創建的對象。
function Person(){
this.test = "1";
}
function Author(){}
Author.prototype = new Person();
這樣你創建一個新的人的實例和返回的對象被饋送到作者。
如果您只是複製它,該怎麼辦?
如果您只是簡單地複製相同的實例在原型之間共享,則在一個原型中進行更改將全部體現出來。
function b(){
this.test = 'a';
this.test1 = function(){
console.log('test1');
}
this.test2 = function(){
console.log('test2');
}
}
function a(){
}
function c(){
}
a.prototype = new b();
var a1 = new a();
c.prototype = a.prototype;
a.test = 'asdf';
console.log(c.test);
數據對實例的唯一性將會丟失。
在其他問題中,原型上的'constructor'屬性將被錯誤地設置。你想'Author.prototype = Object.create(Person.prototype);'。 – 2016-11-25 05:01:48
@torazaburo感謝您提出這個問題。但是Author.prototype = Object.create(Person.prototype);將不會設置原型的正確構造函數。無論如何,您將不得不手動將其重新設置爲原始功能。 –