1
var car = function(){
this.color = 'blue';
}

car.color1 = 'white';
car.prototype.color2 = 'red';

var toyota = new car();

console.log(car.color);         // undefined
console.log(car.color1);        // white
console.log(car.color2);        // undefined

console.log(toyota.color);      // blue
console.log(toyota.color1);     // undefined
console.log(toyota.color2);     // red

您能否解释一下为什么其中 3 个在创建新对象之前和之后有不同的答案。

4

1 回答 1

3

car是一个函数:

var car = function(){
    this.color = 'blue';
};

由于函数是一流的对象,您可以在它们上设置属性:

car.color1 = 'white';

这在某种程度上相当于面向对象语言中的静态属性。

函数也可以充当构造函数(当您使用运算符调用它们时new)。当他们这样做时,他们产生的实例继承自构造函数原型。属性解析查看实例,然后继续向下查看原型链,直到找到属性:

car.prototype.color2 = 'red'; // Property shared by instances of `car`
var toyota = new car(); // toyota is an instance of `car`

当您实例化时car,构造函数被调用并将color实例的属性设置为'blue'.

因此,例如:

  • 当您访问该color属性时,它会在实例上找到。
  • 当您访问color1实例上的属性时,它不存在(它是构造函数的静态属性)。
  • 当您访问该color2属性时,它不会在实例上找到,但可以在原型上找到。

对于函数本身:

  • 当您访问该color属性时,它不存在(因为它只存在于实例上)
  • 当您访问该color1属性时,它被发现是因为您正在检查函数对象本身
  • 当您访问该color2属性时,它不存在(因为它仅存在于实例继承的原型上)。
于 2013-10-03T07:45:36.103 回答