如果關閉,請原諒我的術語。我不明白之間的差別:將函數直接分配給構造函數與其原型之間有什麼區別?爲什麼?
function Person() {};
Person.walk = function() {};
和...
function Person() {};
Person.prototype.walk = function() {};
看來,第二種方法是對構造方法的公約,但我不明白的差異,爲什麼它這樣做。謝謝!
如果關閉,請原諒我的術語。我不明白之間的差別:將函數直接分配給構造函數與其原型之間有什麼區別?爲什麼?
function Person() {};
Person.walk = function() {};
和...
function Person() {};
Person.prototype.walk = function() {};
看來,第二種方法是對構造方法的公約,但我不明白的差異,爲什麼它這樣做。謝謝!
在第一種情況:
function Person() {};
Person.walk = function() {};
您將能夠調用只與功能:
Person.walk();
如果您創建一個Person的一個實例,你將無法調用方法:
p = new Person();
p.walk() // -> TypeError: Object #<Person> has no method 'walk'
另一方面,如果您使用原型,您將只能通過調用該方法一個實例。
那麼使用原型方法,你仍然可以通過Person.prototype.walk()調用方法,但我不知道爲什麼你會想。 – Mordred
'p.prototype.walk();'不正確。 'p'沒有'prototype'屬性。 –
是的,沒錯。我已經從p .__ proto __嘗試過了,walk()不起作用。 –
第一個函數與該構造函數的對象實例沒有關係,您可以將其視爲「靜態方法」。
第二種功能,如要擴展的構造函數的原型,它會提供給使用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();
原型是種與構造函數不同,用於創建實例的模板。請注意,原型的成員實際上並未複製到實例中,而是實例將使用原型的資源,除非資源已由實例擁有。
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)
);
你的意思是「原型的成員實際上沒有複製到實例,而是實例利用原型的資源」。當我在創建var c = new Class()後在控制檯中鍵入c時,它顯示c是具有「a」和「b」屬性的對象。這並不意味着那些原型屬性(或成員...屬性/成員是同一件事?)是該c對象的一部分嗎? – natecraft1
@ natecraft1我無法更好地解釋這一點:http://stackoverflow.com/a/572996/1636522:D – leaf
第一個像靜態方法,第二個依賴於一個實例。 – elclanrs
就像其中一些答案闡明的那樣,第一個是靜態方法,第二個是可以在實例上調用的方法。有關構造函數和原型的更多信息:http://stackoverflow.com/a/16063711/1641941 – HMR