我创建了一个这样的Car
对象。
var Car = Object()
然后我添加了一些属性,如
Car.price = 5000;
Car.color = "red";
然后我创建了一个像
的实例var car1 = Object.create(Car);
我不明白的是,当我致电car1.prototype
或Car.prototype
时,我会undefined
。
根据我所读到的,每个物体都是某物的原型。
有人可以解释为什么它"未定义"?
答案 0 :(得分:4)
每个Object都是某种东西的原型
没有。每个对象都有原型(根对象除外)。但是,只有函数具有prototype
属性。
该属性的值将成为通过将函数作为构造函数调用而创建的对象的原型(例如var obj1 = new Constr();
)。
我不明白的是,当我致电
car1.prototype
或Car.prototype
时,我会undefined
。
如上所述,只有函数具有prototype
属性。 car1
和Car
是对象,因此没有这样的属性。
要获取任意对象的原型,可以使用Object.getPrototypeOf
:
var car1Prototype = Object.getPrototypeOf(car1);
然后我创建了一个像
的实例var car1 = Object.create(Car);
您没有创建Car
的实例。如果您创建了一个新对象并将其原型显式设置为Car
。或者,您可以将Car
定义为构造函数:
function Car(price, color) {
this.price = price;
this.color = color;
}
var car1 = new Car(5000, 'red');
现在Car
是一个函数,Car.prototype
将产生car1
的原型,即
Car.prototype === Object.getPrototypeOf(car1);
答案 1 :(得分:2)
函数有原型。对象实例,例如car1
,不要
说每个对象都是某个原型的副本是正确的。默认情况下,对象是Object
"函数"的原型的副本。但是,对象实例本身并没有原型。
将原型视为"模型"对于一个新的对象。在面向对象语言中,class
或struct
就像新实例的严格模型一样。也就是说,Car
类的每个实例都必须具有motor
。同样,在JavaScript中,函数原型就像"模型"对于该函数的新实例,但它们并不严格。从该模型创建实例后,您可以添加和删除成员,因为该语言是动态的。
修改强>
正如Pointy澄清的那样,对象实例似乎不是"模型的副本"函数prototype
属性。似乎原型被复制到一个内部对象,当您尝试访问实例化对象的属性时,该对象会被查找。
示例:
var car1 = new Car();
// car1 now is not a copy of Car.prototype, but it has an internal object that is.
car1.motor = new V8Motor();
// even though motor is not a property of car1, this will work because JavaScript will find this property in the car1 prototype as it's not a member of the instance itself