當我打電話,會發生什麼......
console.log(Person.getFirstName());
...沒有事先製作的對象?
您收到錯誤消息Person
沒有getFirstName
屬性。
是否有附加屬性到構造函數方法和何時附加到原型對象的一般規則?
是:
如果你想方法可用上通過構造函數創建的對象(例如,obj
,var obj = new Person()
),將該方法放在構造函數的prototype
對象(共享)上,或者通過分配給this
(不共享)的屬性將該方法分配給構造函數中的對象。
如果你想方法可用在構造函數本身,這樣一些內置的JavaScript方法(如Date.parse
或Object.create
),其分配給屬性的構造函數:
Person.doSomething = function() {
// ...
};
這些方法不是特定於由構造函數創建的對象(其中的this
是對構造函數本身的引用,除非您採取某些措施使其不同)。
如果你從一個基於類的語言來,一個很寬鬆的比喻是,性質(包括方法)分配給prototype
對象的構造函數或this
在構造函數中是實例屬性,而你分配給構造函數本身的是靜態屬性。這是一個非常寬鬆的比喻,但有時很有幫助。
這裏的老ES5和早期語法一個完整的例子:
function Person(name) {
this.getName = function() {
return name;
};
}
Person.prototype.sayHello = function() {
console.log("Hello, my name is " + this.getName());
};
Person.copy = function(other) {
return new Person(other.getName());
};
// Usage example
var joe = new Person("Joe");
joe.sayHello();
console.log("joe's name is " + joe.getName());
var joeagain = Person.copy(joe);
joeagain.sayHello();
在上面:
getName
可以用實例通過new Person
創建。它是爲每個對象單獨創建的,不與其他實例共享。它讓我們獲取該人員的姓名,在本例中爲只讀。
sayHello
可以用實例通過new Person
創建,因爲他們從他們的原型,這是從Person.prototype
財產分配給他們的new Person
繼承它。它在實例之間共享。
copy
在實例上不可用(joe.copy()
將是錯誤),它是Person
本身的屬性。在這種情況下,我們用它來複制實例,但它可能適用於任何事情。
太棒了。你幫了我很多。謝謝。 :) –