2012-06-09 2 views
2

Я Codeyear человек и, к сожалению, концепция прототипа объекта не объясняется. Я нашел его и нашел tutorial. После обучения мое понимание говорит о том, что мы используем наследование объектов прототипа для сохранения памяти и совместного использования общих свойств между объектами. Я прав? если да, то вы не думаете, что приведенный ниже код является плохой практикой. Поскольку конструктор автомобилей уже определил цену, скорость и & getPrice, почему нам нужно снова определить одно и то же, поскольку мы используем концепцию наследования. пожалуйста, объясни . ниже приведен код.Наследование прототипа объекта

function Car(listedPrice) { 
    var price = listedPrice; 
    this.speed = 0; 

    this.getPrice = function() { 
     return price; 
    }; 
} 

Car.prototype.accelerate = function() { 
    this.speed += 10; 
}; 

function ElectricCar(listedPrice) { 
    var price = listedPrice; 
    this.speed = 0; 

    this.getPrice = function() { 
     return price; 
    }; 
} 

ElectricCar.prototype = new Car(); // Please also explain why car constructor 
            // is not thowing error since we are not passing 
            // listedPrice parameter 

myElectricCar = new ElectricCar(500); 

console.log(myElectricCar instanceof Car); 
+0

Это может помочь вам: http://stackoverflow.com/questions/10836064/what-does-anobject-prototype-constructor-do – Sarfraz

ответ

3

Конструктор и прототип представляют собой две отдельные концепции. Когда вы применяете прототипное наследование с ElectricCar.prototype = new Car();, он наследует только методы, определенные на объекте и его прототипе, а не сам конструктор.

Вы можете увидеть, как это работает с некоторыми быстрых console.log() звонков:

console.log(ElectricCar); 
console.log(ElectricCar.prototype); 
console.log(ElectricCar.prototype.__proto__); 

Это возвращает:

[Function: ElectricCar] 
{ speed: 0, getPrice: [Function] } 
{ accelerate: [Function] } 

Первая строка является конструктором.

Второй фактический прототип, как установлено ElectricCar.prototype = new Car(); выше. Помните, что в конструкторе Car были установлены и this.getPrice, что объясняет значения ElectricCar.prototype.speed и ElectricCar.prototype.getPrice.

Что, пожалуй, наименее понятно, это последняя строка, ElectricCar.prototype.__proto__. Это прототип прототипа. Объекты Car имеют объект prototype, в котором определены accelerate. Этот прототип копируется на прототип ElectricCar в его внутреннем __proto__ объекте. Это называется prototype chaining.

Поскольку конструктор не является частью прототипа, а прототип - все, что вы наследуете, конструктор для Car был скопирован и вставлен в ElectricCar. Как вы указываете, есть четкие способы сделать это. Вот альтернатива:

function ElectricCar(listedPrice) { 
    Car.apply(this, arguments); 
} 

ElectricCar.prototype = new Car(); 

См apply для более подробной информации.

Что касается вашего последнего вопроса (почему не new Car() выдает ошибку), как говорят другие ответы, это то, как работает JavaScript. Если вы передадите меньше аргументов функции, чем у нее есть параметры, любые неустановленные (так сказать) параметры будут установлены на undefined.Для того, чтобы продемонстрировать:

function returnMe(a) { 
    return a; 
} 

console.log(returnMe(5)); 
console.log(returnMe(2+2)); 
console.log(returnMe()); 
console.log(returnMe(undefined)); 

Это вернет:

5 
4 
undefined 
undefined 

Как вы можете видеть undefined на самом деле является переменная, которую можно обойти (как в returnMe(undefined)). Подробнее об этом см. undefined.

0

getPrice такой способ создать укупорочное над price вар в своей внешней области, фактически делая price частный член, отдельный для каждого различных экземпляров, что только эта функция никогда не может иметь доступ.

Конструктор не выдает ошибку, поскольку предоставление аргументов функции в JavaScript никогда не является обязательным. Вы поставляете столько, сколько хотите, и до тех пор, пока названы аргументы, сначала из списка, который вы предоставили, назначены этим именам.

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