2015-06-27 80 views
2

我是JS的新手。在Javascript中使用創建vs原型

我在JSFiddle中進行了實驗。

我創建了一個對象A,然後創建了兩個新的對象B和C,如下所示。

debugger; 
var A = { 
    name:"h", 
    lastname:'n', 
    address:'B' 
}; 
A.getname = function() 
{ 
    console.log(this.name); 
}; 
var B = Object.create(A); 
var C=new Object(); 
C.prototype = A; 
console.log(B.lastname); 
console.log(C.lastname); 
A.getname(); 
B.getname(); 
C.getname(); 

我已使用從JavaScript的Object.create(舊物)已有對象創建新對象的概念:好零件手冊,並從http://www.codecademy.com/courses/objects-ii/3/3?curriculum_id=506324b3a7dffd00020bf661繼承對象的概念。

調試後, 但我的值console.log(C.lastname)是未定義的,並且C.getname()給我錯誤。

TypeError: C.getname is not a function 

爲什麼它會引發錯誤,在這種情況下使用Object.create()有什麼優勢。

+0

也許使用'Object.create'的是,它的工作,的優勢,而你的'.prototype'代碼纔不是? – Bergi

+0

但是我認爲你實際尋找的答案是'Object.create'就是你用來從現有對象繼承的東西,而'function C(){}; C.prototype = A;'和'var c = new C(); c.lastname; c.getname()'具有執行代碼來初始化實例的優點。 – Bergi

+0

@Bergi我相信問題(其中包括)在這裏'C.prototype = A;'他所引用的原型不是他所需要的。 'C.constructor.prototype'是他正在尋找的。 (我不推薦) –

回答

2

如果要使用.prototype進行繼承,則需要AC作爲類(而不僅僅是對象)。使用Object.createObject.prototype繼承的

var A = function() { 
    this.name = 'h'; 
    this.lastname = 'n'; 
    this.address = 'B'; 
} 
A.prototype.getname = function() { 
    console.log(this.name); 
}; 
var a = new A(); 
console.log(a.getname()); // h 

var C = function() {}; 
C.prototype = new A(); 
var c = new C(); 
console.log(c.lastname); // n 
console.log(c.getname()); // h 

一個顯着的優點是(因爲在這裏可以看到)中的用的Object.create您可以使用簡單對象(而不是類)。

爲了更好地理解使用的Object.create看到@ FelixKling的接受的答案爲similar question的優勢...

+0

相比之下,使用構造函數+'.prototype'超過Object.create'的顯着優點是它們提供了一種方法來初始化所有創建實例。 – Bergi