0

これは清潔さの問題です。

私はプロトタイプを使用して基本的な継承を実装し、コードを DRY に保ちます。すべての意図と目的のために抽象的なプロトタイプがいくつかあります (他のオブジェクトのプロトタイプとして設定される以外にインスタンス化されることは想定されていません)。 「子」オブジェクトが呼び出すコードが含まれています。問題は、プロトタイプの関数がプロトタイプのフィールドの一部に依存していることです。子オブジェクトのフィールドを更新しても、明らかにプロトタイプのフィールドは変更されません。電話は避けたい

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();
4

2 に答える 2

1

代わりにローカル オブジェクトにプロパティを格納し、プロトタイプ関数でそれらを参照します。プロトタイプオブジェクトに状態を保持したくない場合は、実際には関数(または必要に応じて「静的」フィールド)用にする必要があります。

http://jsfiddle.net/C7aPQ/2/

//Prints something once.
function Printer(text)
{
    this.text = text || "";
    this.print = function()
    {
        alert(this.text);
    };
}

//Prints everything a set number of times
function AnnoyingPrinter(text,count)
{
    this.prototype = new Printer(text);
    this.text = text;
    this.count = count || 1;

    this.print = function()
    {
        for(var i =0;i<this.count;i++)
        {
            this.prototype.print.call(this);
        }
    };
}
于 2013-05-14T20:40:21.603 に答える