2013-03-10 80 views
1

我讀professional javascript for web developers,他們提出以下幾點:JavaScript的原型邏輯

此代碼:

var friend = new Person(); 

Person.prototype.sayHi = function(){ 
    alert("hi"); 
}; 

friend.sayHi(); 

但是這個代碼不:

function Person(){ 
} 

var friend = new Person(); 

Person.prototype= { 
    constructor: Person, 
    name: "Nicholas", 
    age: 29, 
    job: "Software Engineer", 
    sayName: function() { 
     alert(this.name); 
    } 
}; 

friend.sayName(); 

我得到的,在第二個例子中,原型是在friend變量被實例化後定義的,但是在那種情況下,爲什麼第一個例子工作?

+1

我在這方面的專家 - 但你讓其完全覆蓋'property'對象?我認爲你應該在對象聲明中創建你想要的變量,然後使用'Person.prototype.sayName = function(){}'。我在想''prototype'還包含了其他各種與Object相關的東西,您將在第二個示例中完全覆蓋它。 – Sygmoral 2013-03-10 22:33:32

+1

在第一個示例中,您將在第二個示例中添加屬性到原型中 - 覆蓋整個原型。這些案例不具可比性。改變他們看起來相似,你會得到相同的行爲 – zerkms 2013-03-10 22:33:37

回答

4

在第一個片段,您要添加到已經被提供給實例現有的原型。在第二個中,您正在創建一個新的原型Person,它與已被賦予friend的原型對象不同。

如果要添加新功能的原型,你可以在任何時候做這個函數被調用之前。在實例化新實例之前,需要完成將新對象分配給構造函數的原型。

+0

是合理的,謝謝! – fox 2013-03-10 22:36:58

+0

附加問題:如果原型尚未在第一個示例中定義,它會不再起作用嗎? – fox 2013-03-10 22:53:16

+1

當您聲明該函數時,會構造一個默認原型。 – Dennis 2013-03-11 01:30:46