javascript差异(车内函数)this.color与car.color1与car.prototype.color2

javascript差异(车内函数)this.color与car.color1与car.prototype.color2,javascript,Javascript,您能解释一下为什么在创建新对象之前和之后,其中3个有不同的答案。car是一个函数: 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); // whit

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

car
是一个函数:

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
由于函数是一级对象,因此可以对其设置属性:

var car = function(){
    this.color = 'blue';
};
这在某种程度上相当于面向对象语言中的静态属性

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

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

例如:

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

  • 当您访问
    color
    属性时,它不存在(因为它只存在于实例上)
  • 当您访问
    color1
    属性时,会发现它,因为您正在检查函数对象本身
  • 访问
    color2
    属性时,它不存在(因为它只存在于实例继承的原型上)
car.prototype.color2 = 'red'; // Property shared by instances of `car`
var toyota = new car(); // toyota is an instance of `car`