在JavaScript中的函数内添加属性到对象?

时间:2014-02-18 23:31:10

标签: javascript function class object

有没有办法,在这个函数中添加另一个属性(用作类):

function DP() {
    var _this = this;

    this.displayTypes = {
        normal: function(div) { _this.displayNormal(div) },
        round: function(div) { _this.displayRound(div) }
    }

    this.displayNormal = function(div) { ... };
    this.displayRound = function(div) { ... };

    this.display = function(div, type) {
        this.displayTypes[type](div);
    }
}

var dp = new DP();

// Now here I'd basically like to add another property to the DP.displayTypes
// called "rect" referencing to a function in a different class called
// DPExtension.displayRect(). So something like this:
//     rect: function(div) { DPExtension.displayRect(div) }

这样我就可以调用dp.display("place-to-display", "rect"),然后它会基本上从displayRect("place-to-display")类/函数执行DPExtension,而调用像dp.display("place-to-display", "round")这样的函数会执行{来自displayRound("place-to-display")的{​​1}}。

如何做到这一点?我尝试用DP做一些事情,但无济于事......

3 个答案:

答案 0 :(得分:2)

由于您希望displayTypes的所有实例共享DP的更改,因此您应该让它由所有实例共享,而不是特定于实例。你可以通过使它成为DP的静态属性来实现这一点:

function DP() {
    // these should probably go on DP.prototype as well
    this.displayNormal = function(div) { ... };
    this.displayRound = function(div) { ... };
}

// static
DP.displayTypes = {
    normal: function(div) { this.displayNormal(div) },
    round: function(div) { this.displayRound(div) }
};

DP.prototype.display = function(div, type) {
    this.displayTypes[type].call(this, div);
};

DP.prototype.displayTypes = DB.displayTypes;


// somewhere else
DP.displayTypes.rect =  DPExtension.displayRect;

您不必全部创建静态属性,您可以直接在原型上定义displayTypes,但通过DB.displayTypes.foo = ...扩展它会比DB.prototype.displayTypes.foo = ...读得更好。

答案 1 :(得分:0)

您是否尝试过这样添加:

var dp = new DP();
dp.displayTypes['rect'] = function(div) { DPExtension.displayRect(div); };

答案 2 :(得分:0)

我认为您可以在创建DP并传递当前实例时将DP更改为具有显示类型对象。创建显示类型时DP。

将DP的方法放在DP.prototype上。以及DisplayTypes.prototype稍后添加方法的DisplayTypes方法会影响所有实例,未来和已创建的实例。

关于原型:https://stackoverflow.com/a/16063711/1641941