2014-09-28 2 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 –

+0

Автомобиль - это транспортное средство, но транспортное средство не обязательно является автомобилем (может быть автобусом). Поэтому вы не можете установить их прототипы равными друг другу. Подробнее о прототипе здесь. http://stackoverflow.com/a/16063711/1641941 – HMR

ответ

3

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

Это один создает объект, прототип Vehicle.prototype. В этом объекте вы ставите свои общие методы для экземпляров Car, пока «наследуете» от Vehicle. Это правильный путь.

Car instance -> Car prototype -> Vehicle prototype 

Car.prototype = Vehicle.prototype;

Это один использует тот же прототип Vehicle к Car. Это означает, что вы будете сбивать один и тот же объект для обоих классов. Добавление к 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.

Смежные вопросы