JavaScript 中的动态实例化

Dynamic Instantaition in JavaScript

本文关键字:实例化 动态 JavaScript      更新时间:2023-09-26

我查看了其他在线示例,但它们不起作用。

所以。。。

我正在尝试在 JavaScript 中实现来自"Head First"的经典"装饰器模式"......我真的很接近。

给定以下"类":

// "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';
    };
};

问:如何从以下函数动态实例化"牛奶"?

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);
}

你需要:

var instance = new window[className](beverage);

怎么样:

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'

顺便说一句,考虑让DarkRoastBeverage类继承,然后定义一个appendCondiment方法来Beverage.prototype。然后你可以写这个:

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

哪个更具可读性。