如何从同一对象的方法引用属性?

时间:2012-11-29 20:11:53

标签: javascript jquery class object reference

你能告诉我为什么这不起作用吗? (请注意关键字)

var post = {
    url: 'http://myurl.com',
    add: function() {
        window.location = this.url + '/add';
    },
    edit: function() {
        window.location = this.url + '/edit';
    }
};

代码中的其他地方:

post.url = '<?php echo BASE_ADMIN . $postType ?>';

$(document).ready(function() {

    $("#listing").aJqueryPlugin({
    ...
    // Buttons and their callbacks
    buttons : [
        {name: 'Add', bclass: 'add', onpress : post.add},
        {name: 'Edit', bclass: 'edit', onpress : post.edit},
    ],
   ...
});

该行

post.url = ....

表现得如预期。 帖子中的网址属性已更新。

但是,当我点击添加修改按钮并输入其功能时, this.url 未定义因为引用了按钮而不是帖子对象。为什么?那么我该怎么做才能从回调中引用 url 属性?

1 个答案:

答案 0 :(得分:2)

由于您使用的是jQuery,因此可以使用$.proxy

    {name: 'Add', bclass: 'add', onpress : $.proxy(post, "add")},
    {name: 'Edit', bclass: 'edit', onpress : $.proxy(post, "edit")},

这将返回一个新函数,该函数将调用由字符串命名的对象的方法。


它实际上是这样做的:

{name: 'Add', bclass: 'add', onpress : function() {
                                           return post["add"].apply(post, arguments);
                                       },
{name: 'Edit', bclass: 'edit', onpress : function() {
                                           return post["edit"].apply(post, arguments);
                                         },

因为函数中this的值取决于函数的调用方式,所以有时需要其他方法来确保获得正确的值。


您也可以在原始对象中设置这些内容,只要您知道您总是希望this引用该对象。

var post = {
    url: 'http://myurl.com'
};
post.add = $.proxy(function() {
    window.location = this.url + '/add';
}, post);
post.edit = $.proxy(function() {
    window.location = this.url + '/edit';
}, post);

这使用$.proxy的其他签名,它允许您直接传递函数,后跟所需的this值。