在原型对象赋值中将实例引用为“this”

时间:2013-03-11 17:54:59

标签: javascript

下面的示例包含一些格式化函数和一个在字段和格式化函数之间映射的对象。

MyObject = function() {};
MyObject.prototype.formatters = {
    'money': function(value) { return "€" + value },
    'hyperlink': function(value) { return "<a href='"+value+"'>"+value+"</a>";
}
MyObject.prototype.fieldFormatters = {
    'field1': this.formatters.money,
    'field2': this.formatters.hyperlink
}

不幸的是,评估时fieldFormatters中的上下文为window,因此我无法引用this.formatters。是否有其他方法可以引用this.formatters或更好地解决此问题?

2 个答案:

答案 0 :(得分:1)

您需要返回prototype,而不是实例:

MyObject.prototype.fieldFormatters = {
    'field1': MyObject.prototype.formatters.money,
    'field2': MyObject.prototype.formatters.hyperlink
};

答案 1 :(得分:1)

仅在上下文中执行函数。

MyObject = function() {};
MyObject.prototype.formatters = {
    'money': function(value) { return "&euro;" + value },
    'hyperlink': function(value) { return "<a href='"+value+"'>"+value+"</a>";
}
MyObject.prototype.getFieldFormatters = function () {
    // here this is instance of MyObject having correct __proto__
    return {
        'field1': this.formatters.money,
        'field2': this.formatters.hyperlink
    }
}

但你可以做一个技巧:使用getters

Object.defineProperty(MyObject.prototype, "fieldFormatters", {get : function () {
    // here this is instance of MyObject having correct __proto__
    return {
        'field1': this.formatters.money,
        'field2': this.formatters.hyperlink
    }
}})