2012-11-29 31 views
0

你能告訴我爲什麼這不起作用嗎? (注意這關鍵字如何從同一對象的方法引用屬性?

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 = ....

按預期運行url property post已更新。

然而,當我點擊添加編輯按鈕,和我輸入它們的功能,this.url不確定因爲引用按鈕,而不是對象。爲什麼?我應該怎麼做才能從回調中引用屬性url

+2

請參閱「閉包」或「Function.bind」。 – 2012-11-29 20:13:06

+0

這與閉包無關,但與執行上下文有關。 – Christoph

+0

[Javascript:Object Literal引用自己的鍵的函數而不是'this']的可能的重複](http://stackoverflow.com/questions/10711064/javascript-object-literal-reference-in-own-keys-function-instead這個) – Bergi

回答

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值的功能。

+0

你應該給擴展的代碼添加一個'return' – Bergi

+0

謝謝你的回覆!這經過一些調整後才起作用,因爲「add」和「edit」函數中的** this **現在引用** Window **。所以我必須更改 this.url +「/ add」 for post.url +「/ add」。 –

+0

@Bergi:好點。更新,謝謝.. –

相關問題