Тогда главное Object.create
облегчает наследование прототипа. Шаблон как это:
function Animal(name) {
this.name = name;
}
Animal.prototype = {
sayName: function() {
console.log(this.name);
}
}
function Tiger(name) {
Animal.call(this, name);
}
Tiger.prototype = Object.create(Animal.prototype, {
scream: {
value: function() {
console.log('Roar!');
}
},
constructor: {
value: Tiger
}
});
tiger = new Tiger('fido');
tiger.scream();
tiger.sayName();
console.log(Animal.prototype.isPrototypeOf(tiger.constructor.prototype));
не так просто скопировать. Существуют полифилы для Object.create, поэтому вы можете достичь того же самого без него, но, в конце концов, то, что он делает, довольно специфично, а в некоторых шаблонах может оказаться полезным.
Причина, по которой Дуглас Крокфорд не использует его, заключается в том, что он больше не использует наследование прототипов (по крайней мере, из этого видео). Таким образом, вы могли бы сделать что-то подобное вместо использования прототипа и Object.create
:
function Animal(name) {
var self = {};
self.name = name;
self.sayName = function() {
console.log(self.name);
}
return self;
}
function Tiger(name) {
var self = Animal(name);
self.scream = function() {
console.log('Roar!');
}
return self
}
tiger = Tiger('fido');
tiger.scream();
tiger.sayName();
console.log(Animal.prototype.isPrototypeOf(tiger.constructor.prototype));
и вы получите более или менее тот же результат, но это не совсем то же самое. Тигр на самом деле не наследует Animal в этом случае. Это другая модель. Вы можете решить использовать его, но это другой подход, а не тот, который заменяет шаблон Object.create
.
Если ES6 используется все чаще и чаще, обычно заменяется Object.create
, но не классами, а классами. Когда классы поддерживаются, вы можете сделать это:
class Animal {
constructor(name) {
this.name = name;
}
sayName() {
console.log(this.name);
}
}
class Tiger extends Animal {
constructor(name) {
super(name);
}
scream() {
console.log('Roar!');
}
}
tiger = new Tiger('fido');
tiger.scream();
tiger.sayName();
console.log(Animal.prototype.isPrototypeOf(tiger.constructor.prototype));
Что более или менее совпадает с первым шаблоном. Так что да, Object.create делает что-то конкретное, но все равно его заменяют классами.