为什么我的对象的原型未定义?

时间:2014-10-26 16:34:24

标签: javascript prototype

我创建了一个这样的Car对象。

var Car = Object()

然后我添加了一些属性,如

Car.price = 5000;
Car.color = "red";

然后我创建了一个像

的实例
var car1 = Object.create(Car);

我不明白的是,当我致电car1.prototypeCar.prototype时,我会undefined

根据我所读到的,每个物体都是某物的原型。

有人可以解释为什么它"未定义"?

2 个答案:

答案 0 :(得分:4)

  

每个Object都是某种东西的原型

没有。每个对象都有原型(根对象除外)。但是,只有函数具有prototype 属性

该属性的值将成为通过将函数作为构造函数调用而创建的对象的原型(例如var obj1 = new Constr();)。

  

我不明白的是,当我致电car1.prototypeCar.prototype时,我会undefined

如上所述,只有函数具有prototype属性。 car1Car是对象,因此没有这样的属性。

要获取任意对象的原型,可以使用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);

另见Introduction to Object-Oriented JavaScript

答案 1 :(得分:2)

函数有原型。对象实例,例如car1,不要

说每个对象都是某个原型的副本是正确的。默认情况下,对象是Object"函数"的原型的副本。但是,对象实例本身并没有原型。

将原型视为"模型"对于一个新的对象。在面向对象语言中,classstruct就像新实例的严格模型一样。也就是说,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