Это проблема чистоты.Изменение поля на прототипе от дочернего объекта
Я использую прототипы для реализации базового наследования, чтобы сохранить мой код СУХОЙ, у меня есть несколько прототипов, которые предназначены для абстрактных целей и целей (не предполагается, что они когда-либо будут созданы за пределами того, чтобы быть установленными в качестве прототипов для другие объекты), и они содержат некоторый код, который вызовут «дочерние» объекты. Проблема в том, что функции в прототипе полагаются на некоторые поля прототипа. Обновление поля на дочернем объекте, очевидно, не изменяет поле прототипа. Я хочу избежать звонка
childObject.prototype.field = foo;
как это становится грязным, чем глубже наследство.
Ниже я вставлял пример, который объясняет, что я пытаюсь сделать. Вы можете видеть, как он работает на jsfiddle here.
//Prints something once.
function Printer(text) {
this.text = text || "";
this.print = function() {
alert(text);
};
}
//Prints everything a set number of times
function AnnoyingPrinter(text, count) {
this.prototype = new Printer(text);
this.count = count || 1;
this.print = function() {
for (var i = 0; i < this.count; i++) {
this.prototype.print();
}
};
}
function doStuff() {
var annoyer = new AnnoyingPrinter("Hello world!", 2);
annoyer.print();
//Now I want to change the text without having to dig down into the prototype (particularly if I ever want to extend AnnoyingPrinter too)
annoyer.text = "Goodbye world!";
annoyer.print();
}
//Expected outcome:
//Hello world!
//Hello world!
//Goodbye world!
//Goodbye world!
//Actual outcome:
//Hello world!
//Hello world!
//Hello world!
//Hello world!
doStuff();
Почему вы назначаете свойство с именем '.prototype' в конструкторе в первую очередь? Вот как работает прототипное наследование. –
Думаю, я, должно быть, подобрал некоторые вредные привычки, изучая JS, каков правильный способ сделать это? –
Вы хотите, чтобы «AnnoyingPrinter» наследовал от «Принтера»? Если это так, я соберу ответ, который показывает хороший образец. –