2015-01-08 27 views
1

我想了解JavaScript中的'類'。模擬'類'時,爲什麼要在.prototype屬性中設置方法,而不是在構造函數本身中?

在JavaScript通常模擬類看起來是這樣的:

function MyClass(someParameter) { 
    this.someValue = someParameter; 
    this.someOtherValue = "green"; 
} 

MyClass.prototype.someMethod = function() { 
    console.log("Hello!"); 
}; 

雖然非成員函數被設置在構造函數中,該方法是在構造函數之外增加,到構造的.prototype財產。

我想了解爲什麼。爲什麼不在構造函數內部創建方法,就像其他成員一樣?含義:

function MyClass(someParameter) { 
    this.someValue = someParameter; 
    this.someOtherValue = "green"; 

    this.someMethod = function() { 
     console.log("Hello!"); 
    } 
} 
+0

http://stackoverflow.com/questions/1635116/javascript-class-method-vs-class-prototype-method – adeneo

+0

有在類中沒有這樣的事情JavaScript的。但是有一些方法可以創建一個對象。 (http://www.phpied.com/3-ways-to-define-a-javascript-class/) –

+2

原型上的屬性由所有實例共享**。您在構造函數中分配給'this'的屬性是不同的。您可以在構造函數中設置函數值屬性,並且可以在原型上設置非函數值屬性。 – Pointy

回答

1

下面是一些要點:

  • 性能:構造函數方法,而每個創建原型方法一次inherited.prototype是更好地在這裏創建一個實例時創建的。
  • Ctor方法可以訪問你的函數中的私有數據,而原型數據則不能。
1

爲什麼不像創建其他成員一樣在構造函數中創建方法?

因爲實例之間的方法通常不是不同的。在你的例子中,每個實例都有相同的someMethod方法,做同樣的事情。所以只有創建該方法一次纔有意義。

另一方面,標量數據通常是特定的(即實例之間不同),因此應在構造函數中初始化。


FWIW,ECMAScript6引入了鼓勵這種結構的新的class語法。

function MyClass(someParameter) { 
    this.someValue = someParameter; 
    this.someOtherValue = "green"; 
} 

MyClass.prototype.someMethod = function() { 
    console.log("Hello!"); 
}; 

相當於

class MyClass { 
    constructor(someParameter) { 
     this.someValue = someParameter; 
     this.someOtherValue = "green"; 
    } 

    someMethod() { 
     console.log("Hello!"); 
    } 
} 
相關問題