Object.create против прямого прототипного наследования

Я играл с 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();
9
задан hippietrail 31 January 2013 в 00:10
поделиться