2016-11-25 64 views
2

將函數原型複製到另一個函數(如下所示)有什麼危害。原型繼承:將函數原型複製到另一個

function Person(){} 
Person.prototype = {}; 
function Author(){} 
Author.prototype = Person.prototype; 
+0

在其他問題中,原型上的'constructor'屬性將被錯誤地設置。你想'Author.prototype = Object.create(Person.prototype);'。 – 2016-11-25 05:01:48

+0

@torazaburo感謝您提出這個問題。但是Author.prototype = Object.create(Person.prototype);將不會設置原型的正確構造函數。無論如何,您將不得不手動將其重新設置爲原始功能。 –

回答

1

JS中的對象分配創建一個引用。

var o = {}; 
var c = o; 

現在兩個物體oc指的是相同的對象。試圖將一個對象的原型分配給另一個時,同樣的規則適用。

Author.prototype = Person.prototype; 

現在既AuthorPerson的原型是指一個單獨的對象。如果你將一些數據放在Author的原型屬性中,那麼Person也會有相同的數據。對於不同的對象來說,這是最不可能的

一個這樣做的正確方法是

Author.prototype = Object.create(Person.prototype); 

在這裏,您創建Author.prototype一個全新的對象 - 但Person對象繼承。

0

因爲您通過引用傳遞原型,這意味着兩者都受到所有更改的影響。考慮:

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. 
0

附着方法爲原型的理想方法是通過創建其通過實例創建的對象。

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); 

數據對實例的唯一性將會丟失。