Javascript范围/这个

时间:2014-03-16 23:04:31

标签: javascript this

我怎么做的时候:

function Dog(){
   this.firstName = 'scrappy';
}

Dog.firstName未定义?

然而,我可以这样做:

Dog.firstName = 'scrappy';

现在Dog.firstName返回' scrappy'?

2 个答案:

答案 0 :(得分:11)

  

我怎么做... Dog.firstName未定义?

由于...

  

然而,我可以做...现在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