当我打电话,会发生什么......
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
本身的属性。在这种情况下,我们用它来复制实例,但它可能适用于任何事情。
太棒了。你帮了我很多。谢谢。 :) –