Возвращая объект, который явно определенный вы нарушаете «из-оф -box "прототипной цепи наследования, которая является родной для JavaScript. Ниже канонический пример использования конструктора для создания экземпляров новых объектов, которые наследуют от прототипа ...
function PersonTemplate(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
Отсюда мы можем добавить методы на protoype
PersonTemplate
«s, что делает использование Protoype цепи.
PersonTemplate.prototype.sayHello = function() {
return 'Hello, my name is ' + this.firstName + '!';
}
var john = new PersonTemplate('John', 'Smith');
john.sayHello(); // => "Hello, my name is John!"
Теперь, если мы должны были попытаться использовать прототипичное наследование через ваш пример выше (при условии, sayHello
еще добавляются к PersonTemplate.prototype
, это будет результатом ...
var PersonTemplate = function() {
return {
firstName: '',
lastName: ''
}
}
var john = new PersonTemplate('John', 'Smith');
john.sayHello(); // => Uncaught TypeError: john.sayHello is not a function
Явно возвращать объектный литерал от вашего конструктора, эта связь сломана, и вы больше не используете «классический» объектно-ориентированный JavaScript через цепочку прототипов.
Это не значит, что нет эзотерических и совместных которые можно было бы расширить, и объединить новую методику наследования. В конце концов, есть всевозможные творческие способы компоновки и связывания объектов (например, OLOO стиль от Kyle Simpson here, но это для более широкого обсуждения.