1

他のオンラインの例を見ましたが、うまくいきませんでした。

そう...

JavaScript で「Head First」の古典的な「Decorator パターン」を実装しようとしています...そして私は本当に近いです。

次の「クラス」が与えられた場合:

// "CLASSES": BEVERAGES
function DarkRoast(){
    this.cost = 1.00;
    this.description = "Dark Roast";
};

// DECORATORS: CONDIMENTS
function Milk(beverage){
    var instance = beverage;
    beverage.cost = function(){
        return instance.cost + 0.25;
    };
    beverage.description = functionn(){
        return instance.description + ', Milk';
    };
};

質問: 次の関数から "Milk" を動的にインスタンス化するにはどうすればよいですか?

function appendCondiment(className, beverage) {
    /* Needs to do this, but dynamically:
        var instance = new Milk(beverage); */

    // This fails (of course)
    var instance = new window[className].call(beverage);
}
4

2 に答える 2

0

どうですか:

var DarkRoast = function () {
    this.cost = 1.00;
    this.description = 'Dark Roast';
};

var condiments = {
    milk: {
        cost: 0.25;
        description: 'Milk'
    },
    cream: {
        cost: 0.3,
        description: 'Cream'
    }
};

var appendCondiment = function ( condimentName, beverage ) {
    var condiment = condiments[ condimentName ];
    beverage.cost += condiment.cost;
    beverage.description += ', ' + condiment.description;
};

使用法:

var bev = new DarkRoast();
appendCondiment( 'milk', bev );

bev.cost // 1.25
bev.description // 'Dark Roast, Milk'

ところで、クラスDarkRoastから継承し、メソッドを にBeverage定義することを検討してください。次に、これを書くことができます:appendCondimentBeverage.prototype

var bev = new DarkRoast();
bev.appendCondiment( 'milk' );

これはより読みやすいです。

于 2012-08-19T12:06:49.927 に答える
0

必要なもの:

var instance = new window[className](beverage);
于 2012-08-19T11:54:47.433 に答える