2010-01-08 68 views
2

我拿起了一本新書在ASP.NET和AJAX和它(一個像瓶蓋不JQuery的)有這樣一個例子:的Javascript原型

Person = function(firstName) { 
    this._firstName = firstName; 
} 

Person.prototype = { 
    get_FirstName = function() {return this._firstName;} 
} 

我立刻注意到這並不是什麼我已經習慣了,而FireBug顯然同意我的看法。我習慣了這樣的:

Person.protoype = { 
    get_FirstName: function() {return this._firstName;} 
} 

這只是作者的部分錯字,或者他可能使用從ASP.NET AJAX庫中的功能?

此外,有沒有前述功能和這個之間的差:

Person.protoype.get_FirstName = function() { 
    return this._firstName; 
} 

沒有作者只是斯馬什同一函數的兩個上可接受的聲明一起?

回答

2

第一個問題,是的,我認爲這是一個錯字。

第二個問題,是的,是有區別的。的不明智的:從在其中定義該方法的匿名對象({}

Constructor.prototype = { method : function(){} } 

繼承。 如果這是第二次完成,那麼之前的方法會消失,因爲繼承鏈現在會指向一個新的匿名對象。

更通常的:

Constructor.prototype.method = function(){} 

簡單地定義了一個新的方法。

1

您的第一個問題是,這是一個錯字或錯誤 - 這不是有效的JavaScript。

關於你最後一個問題實際上這兩個例子之間的差異,如果已經有東西附加到原型。第一個設置原型屬性,將刪除以前對原型進行的任何其他操作,而第二個僅增加已有的原型。我會(並且確實)使用第二種方式,爲原型添加一個新屬性。

1

對於你的問題的第二部分,如果使用沒有新的對象分配給您可以使用繼承原型屬性:

Person = function() { 
}; 

Person.prototype = new Individual(); 

Person.protoype.set_LastName = function(lastname) { 
    this.lastName = lastname 
}; 

//inherited from Individual: 
Person.get_FirstName(); 
+0

第二部分很有意思...謝謝。 – blu 2010-01-08 03:24:20

+0

小心!通過將'Person.prototype'引用與'Individual.prototype'相同的對象,您已將'set_LastName'添加到'Individual'的實例!你可能不想這樣做。 – bobince 2010-01-08 04:52:53

+0

哦,你是對的,它應該是Person.prototype = new Individual() – 2010-01-08 05:25:17

1

有與示例的幾個問題:

  1. Person應該用var聲明。建議始終使用變量來做到這一點。
  2. 錯字,在其他答案中提到。
  3. getter/setter模式,可能受C#的屬性影響。除非你正在做一些複雜的事情,否則這可能是JavaScript中的矯枉過正,你的代碼會更簡單地使用一個屬性。另外,新的ECMAScript 5規範引入了用於語言屬性的getter和setter方法,並且一些瀏覽器已經實現了它們,但它們還不夠普及以至於不能在Web上使用。