2014-09-28 141 views
1

我已经喜欢JavaScript的原型继承

function Vehicle(){ 
    this.isMovable = true; 
} 
Vehicle.prototype = { 
    hasTyres:function(){ return true;}, 
    needsFuel:true 
}; 

var Car = function(){ 
    Vehicle.call(this); 
    this.type = "Car"; 
}; 

现在一些代码

它的工作原理,即使我创建原型这样

Car.prototype = Object.create(Vehicle.prototype); 

Car.prototype = Vehicle.prototype; 

是什么区别 ?

我的印象是,

Car.prototype = Object.create(Vehicle); 

将使汽车从车辆的继承,但它不是。

谁能解释发生了什么的Object.create方法内

感谢, SRK

+2

如果你想知道什么'Object.create'呢,看看在MDN文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create – 2014-09-28 03:00:28

+0

汽车是一辆汽车,但汽车不一定是汽车(可以是公交车)。所以你不能将它们的原型设置为彼此相等。更多关于这里的原型。 http://stackoverflow.com/a/16063711/1641941 – HMR 2014-09-28 03:30:16

回答

3

Car.prototype = Object.create(Vehicle.prototype);

这一个创建一个对象,其原型是Vehicle.prototype。在此对象中,您将Car实例的共享方法从Vehicle“继承”。这是正确的路要走。

Car instance -> Car prototype -> Vehicle prototype 

Car.prototype = Vehicle.prototype;

这一个用来VehicleCar相同的原型。这意味着你会为这两个类打破同一个对象。添加到Car.prototype意味着也将其添加到Vehicle.prototype,这是你不想要的。

Car instance -> Car prototype (which is also Vehicle prototype) 

Car.prototype = Object.create(Vehicle);Car.prototype是一个对象,其原型为Vehicle,的函数。你也不想要这个。

Car instance -> Car prototype -> Vehicle function 
1

Vehicle是一个函数。调用Object.create(Vehicle);将创建一个原型为该函数的对象。
这不是你想要的。

写入Car.prototype = Vehicle.prototype;将为这两个类使用相同的prototype对象,从而无法将函数仅添加到派生类。

有关更多详细信息,请参阅my blog