2016-05-30 4 views
-1

Я исхожу из консервативного языка ООП (JAVA) и действительно не понимаю наследование Javascript. Я также шаткий со всей концепцией Prototype, но я видел пример here, который отвечает на мои потребности, но я не понимаю деталей и почему все не так по-другому.Javascript Prototype и inheritance

Принимая их примеру, правильная реализация выглядит следующим образом

function Animal(name) { 
    this.name = name; 
} 

// Example method on the Animal object 
Animal.prototype.getName = function() { 
    return this.name; 
} 

function Mammal(name, hasHair) { 
    // Use the parent constructor and set the correct `this` 
    Animal.call(this, name); 

    this.hasHair = hasHair; 
} 

// Inherit the Animal prototype 
Mammal.prototype = Object.create(Animal.prototype); 
// Set the Mammal constructor to 'Mammal' 
Mammal.prototype.constructor = Mammal; 

Я не понимаю, цель функции Object.call() и я не понимаю, почему Object.create() был использован, а не просто просто Animal.prototype. Также почему конструктор добавляется в последнюю строку? Это потому, что он был удален на предыдущем шаге? И что мне делать, если я хочу использовать код среди всех экземпляров Mammal?

Заранее спасибо

+0

Чтобы ответить на один из ваших вопросов: методы 'call',' 'apply' и bind' из' Object' прототипа являются единственным способом установить 'this' непосредственно при вызове метода. В противном случае 'this' определяется контекстом вызова метода (объект, на который был вызван метод). – rand

ответ

0

Если вы не называли Mammal.prototype.constructor = Mammal; то конструктора будет Animal() (который является конструктором Animal.prototype по умолчанию)

Использование Object.create() означает Mammal.prototype не a ссылка на Animal.prototype, но вместо этого новый объект, наследующий этот прототип.

И использование Object.call() обеспечивает область действия не для функции, вызывающей метод, а вместо этого является областью конструктора млекопитающих.

0

Javascript не может расширять классы, подобные Java. Вы можете имитировать только что-то подобное.

Animal.call убедитесь, что это животное. Это не указывает на животное, а скорее указывает на млекопитающее. Короче говоря, функция call() перезаписывает @this.

Object.create просто создает экземпляр пустой функции с данным объектом, как прототип:

Object.create = function (o) { 
    function F() {}; 
    F.prototype = o; 
    return new F(); 
} 

Его необходимо только при использовании детского constuctor. Если не простой объект будет делать это.

Вот хороший совет: http://javascriptissexy.com/oop-in-javascript-what-you-need-to-know/

+0

С ES6 теперь это возможно. –

+0

es6 далеко не обычный: https://kangax.github.io/compat-table/es6 – Steffomio