我怎么做的时候:
function Dog(){
this.firstName = 'scrappy';
}
Dog.firstName未定义?
然而,我可以这样做:
Dog.firstName = 'scrappy';
现在Dog.firstName返回' scrappy'?
答案 0 :(得分:11)
我怎么做...
Dog.firstName
未定义?
由于...
...永远不会调用Dog
,因此永远不会执行第this.firstName = 'scrappy';
行...
...即使您调用该函数,this
也可能不会引用函数Dog
。您可以<{1}}引用this
的方式调用它,但这很不寻常。 How the value of this
is determined has been explained extensively。
然而,我可以做...现在Dog.firstName返回'scrappy'?
函数只是对象,因此您可以为其指定任何属性。
答案 1 :(得分:2)
Dog()
函数只是构造函数,因此您在构造函数上调用firstname
而不是它的实例。这不是仅仅因为它在返回的对象上定义而定义的,它们是完全不同的东西。但是,因为您可以使用字段扩充函数,所以无论如何都可以为dog.firstName赋值。
首先,让我演示构造函数和实例之间的区别:
function Dog() {
this.firstName = 'scrappy';
}
Dog.firstname; // undefined on the constructor
Dog.prototype; // defined on constructor, returns an empty object
var myDog = new Dog();
myDog.firstname; // defined on instance, returns 'scrappy'
myDog.prototype; // undefined on instance
正如您所看到的,构造函数(返回对象的函数)与它返回的对象完全不同,因此具有完全不同的字段。当你让Dog.firstname返回'scrappy'时你所看到的是向构造函数添加一个新字段的结果。这是可行的,但请记住,向构造函数添加字段不会将相同的字段添加到构造中。考虑:
Dog.someNewProperty = 'whatever';
var myDog = new Dog();
Dog.someNewProperty; // 'whatever'
myDog.someNewProperty; // undefined