你能告诉我为什么这不起作用吗? (请注意此关键字)
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 属性?
答案 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
值。