Я играл с 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();