问题:
- 为什么第一种方法能正确识别物体为法拉利?(在 Chrome 中测试)
- 我在这两种方法中正确地进行继承吗?
- 我是否正确理解第一个示例中存在一些隐藏的“构造函数”属性,如果是,它们在哪里,是什么把它们放在那里?在我没有明确输入的第二个示例中是否有任何隐藏的构造函数属性?
- 如果我已经正确地完成了继承,我应该使用最后两种方法中的哪一种来让对象被识别为法拉利?或者我应该不在乎 - 毕竟“instanceof”仍然有效?
语境:
使用 JavaScript 的“新”方法创建对象,效果很好:
Vehicle.prototype = {}; // Not required I know
function Vehicle() {
}
Car.prototype = new Vehicle();
function Car() {
}
Ferrari.prototype = new Car();
function Ferrari() {
}
var o = new Ferrari();
console.log(o);
哪个输出:
> Ferrari
> __proto__ : Car
> __proto__ : Vehicle
> __proto__ : Object <- The one that isn't required
> __proto__ : Object <- Provided by JS
...
hasOwnProperty: function hasOwnProperty() { [native code] }
...
现在我想做同样的事情来避免使用 new 关键字,这就是我所拥有的:
Vehicle.prototype = {};
function Vehicle() {
var vehicle = Object.create(Vehicle.prototype);
return vehicle;
}
Car.prototype = Vehicle();
Car.prototype.constructor = Vehicle;
function Car() {
var car = Object.create(Car.prototype);
return car;
}
Ferrari.prototype = Car();
Ferrari.prototype.constructor = Car;
function Ferrari() {
var ferrari = Object.create(Ferrari.prototype);
//ferrari.constructor = Ferrari; <- Lookey here - commented line
return ferrari;
}
var o = new Ferrari();
console.log(o);
哪个输出:
> **Car**
> __proto__ : Car
> constructor : function Car()
__proto__ : Vehicle
> constructor : function Vehicle()
__proto__ : Object <- The one that isn't required
> __proto__ : Object
...
hasOwnProperty: function hasOwnProperty() { [native code] }
...
请注意,输出的第一行现在是 Car,而不是 Ferrari。这可以通过删除注释行来纠正,或者通过改变法拉利的原型如下:
var realPrototype = Car();
realPrototype.constructor = Car;
Ferrari.prototype = Object.create(realPrototype);
Ferrari.prototype.constructor = Ferrari;