2014-01-27 40 views
0

如果關閉,請原諒我的術語。我不明白之間的差別:將函數直接分配給構造函數與其原型之間有什麼區別?爲什麼?

function Person() {}; 
Person.walk = function() {}; 

和...

function Person() {}; 
Person.prototype.walk = function() {}; 

看來,第二種方法是對構造方法的公約,但我不明白的差異,爲什麼它這樣做。謝謝!

+0

第一個像靜態方法,第二個依賴於一個實例。 – elclanrs

+0

就像其中一些答案闡明的那樣,第一個是靜態方法,第二個是可以在實例上調用的方法。有關構造函數和原型的更多信息:http://stackoverflow.com/a/16063711/1641941 – HMR

回答

3

在第一種情況:

function Person() {}; 
Person.walk = function() {}; 

您將能夠調用只與功能:

Person.walk(); 

如果您創建一個Person的一個實例,你將無法調用方法:

p = new Person(); 
p.walk() // -> TypeError: Object #<Person> has no method 'walk' 

另一方面,如果您使用原型,您將只能通過調用該方法一個實例。

+1

那麼使用原型方法,你仍然可以通過Person.prototype.walk()調用方法,但我不知道爲什麼你會想。 – Mordred

+4

'p.prototype.walk();'不正確。 'p'沒有'prototype'屬性。 –

+0

是的,沒錯。我已經從p .__ proto __嘗試過了,walk()不起作用。 –

1

第一個函數與該構造函數的對象實例沒有關係,您可以將其視爲「靜態方法」。

第二種功能,如要擴展的構造函數的原型,它會提供給使用new關鍵字創建的所有對象實例

例子:

// constructor function 

function MyClass() { 
    var privateVariable; // private member only available within the constructor fn 

    this.privilegedMethod = function() { // it can access private members 
    //.. 
    }; 
} 

// A 'static method', it's just like a normal function 
// it has no relation with any 'MyClass' object instance 
MyClass.staticMethod = function() {}; 

MyClass.prototype.publicMethod = function() { 
// the 'this' keyword refers to the object instance 
// you can access only 'privileged' and 'public' members 
}; 

var myObj = new MyClass(); // new object instance 

myObj.publicMethod(); 
MyClass.staticMethod(); 
1

原型是種與構造函數不同,用於創建實例的模板。請注意,原型的成員實際上並未複製到實例中,而是實例將使用原型的資源,除非資源已由實例擁有。

var Class = function() {}; 
Class.prototype.a = 1; 
Class.prototype.b = 2; 

// creates a new instance named "c" 
var c = new Class(); 
c.b = 3; 

console.log(
    c.hasOwnProperty('a'), // -> false 
    c.hasOwnProperty('b'), // -> true 
    c.a, // -> 1 (prototype) 
    c.b, // -> 3 (instance) 
    Class.prototype.b // -> 2 (prototype) 
); 
+0

你的意思是「原型的成員實際上沒有複製到實例,而是實例利用原型的資源」。當我在創建var c = new Class()後在控制檯中鍵入c時,它顯示c是具有「a」和「b」屬性的對象。這並不意味着那些原型屬性(或成員...屬性/成員是同一件事?)是該c對象的一部分嗎? – natecraft1

+0

@ natecraft1我無法更好地解釋這一點:http://stackoverflow.com/a/572996/1636522:D – leaf

相關問題