Я играл с Object.create в спецификации EcmaScript 5, и я пытаюсь создать структуру типа множественного наследования.
Скажем, у меня есть несколько функций: a, b, и c. Имея дело только с прототипами, я могу сделать следующее:
function a () {}
a.prototype = {
fnA = function () {},
propA = 500
};
function b () {}
b.prototype = a.prototype;
b.prototype.fnB = function () {};
b.prototype.propB = 300;
function c () {}
c.prototype = b.prototype;
c.prototype.fnC = function () {};
c.prototype.propC = 200;
Но, используя Object.create, я бы сделал следующее:
function a() {}
a.prototype = {
fnA = function () {},
propA = 500
};
var b = Object.create(new a());
b.fnB = function () {};
b.propB = 300;
var c = Object.create(b);
c.fnC = function () {};
c.propC = 200;
Я думаю, что получаю тот же результат в обоих направлениях.
Это кажется немного неуклюжим, потому что я получаю на объекте обратно вместо функции конструктора. Мне кажется, что выполнение обычного прототипного наследования менее навязчиво и имеет больше смысла для модульных приложений, которые не нуждаются в особой обработке для работы.
Я что-то упускаю? Есть ли польза от попытки создать Object.create с конструкторами? Или это полезно только для копирования существующих объектов? Мне нужен доступ только к свойствам и функциям, прикрепленным к прототипу, а не к функциям и свойствам, добавленным впоследствии к объекту.
Или как насчет этого (или использовать более глубокую копию, но идея остается той же)?
function A () {}
A.prototype = {
fn: function () {
console.log(this.propA + 30);
},
propA: 20
};
function B () {}
Object.keys(A.prototype).forEach(function (item) {
B.prototype[item] = A.prototype[item];
});
B.prototype.propA = 40;
function C () {}
Object.keys(B.prototype).forEach(function (item) {
C.prototype[item] = B.prototype[item];
});
C.prototype.fn = function () {
console.log(this.propA + 3);
};
var a = new A(),
b = new B(),
c = new C();
a.fn();
b.fn();
c.fn();