總之,沒有。
Person.sayHello = function() {...};
該行將向Person類本身添加一個名爲「sayHello」的函數,而不是Person類的實例。因此,它只能通過
Person.sayHello();
,而不是如果你熟悉Java或C#援引
var matt = new Person('Matt');
matt.sayHello();
// sayHello is not defined on matt
,加上以這種方式的人的方法是像創建一個靜態方法。
然而,我們可以添加一個方法的實例,而無需向原型添加方法。
方法1:在人這種方法的
var Person = function (firstName) {
this.firstName = firstName;
this.sayHello = sayHello() {...};
};
構造函數創建「的sayHello」功能有一個新功能是用於人的每一個實例創建的缺點。也就是,
var frank = new Person('Frank');
var matt = new Person('Matt');
// frank.sayHello != matt.sayHello;
因此,這種方法可能在內存上很難。但是,它確實允許通過關閉進行封裝(例如,私有狀態)。在下面的示例中,不調用「sayHello」函數就不能修改Person類之外的「count」變量。
var Person = function (firstName) {
this.firstName = firstName;
this.sayHello = sayHello() {
count++;
console.log("Hello has been said " + count + "times".
};
var count = 0;
};
方法2:人的構造以外創建「的sayHello」功能和Person
var Person = function (firstName) {
this.firstName = firstName;
this.sayHello = sayHello;
};
function sayHello() {...}
此方法的構造內分配給它具有較低的內存使用情況的優點; sayHello函數只有一個實例,它在Person的實例間共享。即,
var frank = new Person('Frank');
var matt = new Person('Matt');
// frank.sayHello == matt.sayHello;
這使得它與原型方法相似。然而,函數的賦值給每個實例仍然比原型方法消耗更多的內存,其中函數只被賦值給原型對象。
但是,與原型方法一樣,此方法不允許使用私有狀態。所有狀態必須通過this
關鍵字通過公開狀態進行訪問。
更新:在存儲器使用方法1和方法2之間
方法1的差的澄清是這樣的:
var function1 = function() { console.log('Hello'); };
var function2 = function() { console.log('Hello'); };
的函數具有相同的特性,但不平等。 JavaScript不知道它們在功能上是相似的,所以它在內存中創建兩個函數來表示它們。
方法2是這樣的:
var sayHello = function() { console.log('Hello'); };
var function1 = sayHello;
var function2 = sayHello;
現在功能1和功能2實際上是相同的功能,因爲它們都只是堅持sayHello的參考。
更新:模塊模式的實施例的使用,以避免在方法2
該模塊定義由匿名閉合限定的模塊中的Person類加入「的sayHello」到全球範圍內(一個自我執行的函數)並將其導出到全局範圍。由於「sayHello」在模塊的關閉中定義,並且未導出,因此不會將其添加到全局範圍。
var Person = (function() {
function Person(firstName) {
this.firstName = firstName;
this.sayHello = sayHello;
};
function sayHello() {...}
return Person;
}());
這不是語言的工作原理。你爲什麼想要或需要這樣做? – meagar
只是想知道這兩個^ _^ –
我不知道的區別。當你嘗試它時它有效嗎? –