Задать вопрос
@88z

Как орагнизовать наследование в Javascript таким образом, чтобы наследовались статические методы?

Наследование у меня реализуется так:
var Parent = function(){
    this.foo='foo';
};
Parent.prototype.method = function(){
    console.log('i am not static');
};
Parent.staticMethod = function(){
    console.log('i am static');
}

var Child = function(){
    Parent.apply(this, arguments);  
    this.bar = 'bar';
};
Child.prototype = new Parent();

var kid = new Child();
kid.method();//все оукей
Child.staticMethod();//undefined is not a function


Как вы заметили, Child.staticMethod === undefined.
Я знаю, что можно сделать:
Child.staticMethod = Parent.staticMethod
Такое решение меня не устранивает, потому что статических методов много, иерархия классов будет постоянно расти и добавлять для каждого класса и метода по строчке кода я не хочу.

Поделитесь, пожалуйста, идеями реализации наследования в javascript, при котором можно удобно наследовать статические методы.
  • Вопрос задан
  • 2923 просмотра
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 4
deleted-tnorman
@deleted-tnorman
extend?

function extend(target, source) {
for (var prop in source) {
if (source.hasOwnProperty(prop)) {
target[prop] = source[prop];
}
}
return target;
}
Ответ написан
Комментировать
Petroveg
@Petroveg
Миром правят маленькие с#@&ки
А кому немного извращений? Функции же у нас — первоклассные граждане:)

var SuperClass = function (callback) {
	callback.staticMethod = function () {
		console.log('I\'m static');
	};
	return callback;
};

var Parent = SuperClass(function () {
	this.foo = 'foo';
});
Parent.prototype = {
	method: function () {
		console.log('I\'m not static');
	}
};

var Child = SuperClass(function () {
	Parent.apply(this, arguments);
	this.bar = 'bar';
});
Child.prototype = Object.create(Parent.prototype);

var kid = new Child();

console.log(kid.foo);
console.log(kid.bar);
kid.method();
Parent.staticMethod();
Child.staticMethod();


И кстати, из-за этого:
Child.prototype = new Parent()
вы получаете в прототипе Parent свойство foo. Вы точно этого хотели?
Ответ написан
Комментировать
k12th
@k12th
console.log(`You're pulling my leg, right?`);
Мне нравится, как сделано в Backbone.
Ответ написан
Комментировать
Посылаем IE10- к чёртовой бабушке - и всё наследование как прототипа, так и статических методов, сводится к:
Child.__proto__ = Parent;
Child.prototype.__proto__ = Parent.prototype;
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы