ghaiklor
@ghaiklor
NodeJS TechLead

Как расширить прототип одного класса прототипом с другого?

Добрый вечер!

Столкнулся с такой проблемой. Имеется два класса, у каждого из них есть свой прототип.
Нужно, вызвав конструктор одного класса, расширить атрибуты этого класса и его прототип с другого. Попробую на примере показать:
//Foo - это класс, с которого нужно расширить
function Foo() {
    this.foo = 'foo';
    return this;
}

Foo.prototype = {
    constructor: Foo,
    fooFunction: function() {
        console.log(this.foo);
    }
}

//Bar - это класс, в который нужно "влить" Foo
function Bar() {
    this.bar = 'bar';
    //Изменение контекста решает проблему с "влить" атрибуты и Foo
    //this.bar == 'bar'; this.foo == 'foo';
    Foo.apply(this, arguments);
    return this;
}

Bar.prototype = {
    constructor: Bar,
    //Вот как сюда получить методы с Foo?
    barFunction: function() {
        console.log(this.bar);
    }
}


Задача стоит следующая. Нужно "смерджить" эти два класса в Bar вместе с его атрибутами и прототипом. В итоге я хочу получить класс Bar, в котором есть методы fooFunction и barFunction в прототипе и this.foo, this.bar в атрибутах. Таким образом после "слияния" можем сделать так:
var bar = new Bar();
bar.foo == 'foo';
bar.bar == 'bar';
bar.fooFunction() == 'foo';
bar.barFunction() == 'bar';


Каким паттерном это можно реализовать?
Заранее благодарю.
  • Вопрос задан
  • 2624 просмотра
Решения вопроса 1
icelaba
@icelaba
Знаю и умею всё
function MyBar() {
Bar.call(this);
Foo.call(this);
}
MyBar.prototype = Object.create(Foo.prototype);
_.extend(MyBar.prototype, Bar.prototype);

где _ это библиотека underscore
если не используете то или начните или сорс тут underscorejs.org/docs/underscore.html

var _ = {};
var slice = Array.prototype.slice;
_.extend = function(obj) {
each(slice.call(arguments, 1), function(source) {
if (source) {
for (var prop in source) {
obj[prop] = source[prop];
}
}
});
return obj;
};

и если хотите чтобы имя было именно Bar то
TmpBar = Bar
код выше c заменой Bar на TmpBar
Bar = MyBar
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы