0

我有一个有方法的对象。此方法可以作为对象上的方法或回调函数触发。确定如何调用它的最佳方法是什么?我想出了一个我不确定是否可靠的解决方案。

function Object() {
    this.method = function(elem) {
        if (elem.type !== undefined) {
            alert("we've got an event");
        } else {
            alert("it doens's seem to be an event");
        }
    }
}
var obj = new Object();
$('span').click(obj.method);
obj.method($('div'));

我决定稍微编辑一下我的问题,以指出问题不在于“this”参数以及如何绑定函数的上下文。

4

8 回答 8

1

我不确定为什么调用代码的方式很重要。我敢打赌,如果你能清楚说明为什么它很重要,你会看到有一个参数应该传递给函数,让函数知道这一点。然后你可以制作一个简单的包装器来适当地完成它:

function MyObject() {
    this.method = function(randomParam1, randomParam2, calledThroughAlert) {
        // calledThroughAlert knows what you need to know.
    }
}

function callbackToMyObject() {
    obj.method('foo', 'bar', true);
}
var obj = new MyObject();
$('span').click(callbackToMyObject);
obj.method('bar', 'foo'); // defaults the calledThroughAlert param to false
于 2013-07-29T19:42:00.787 回答
1

如果它只是关于 jQuery 的东西(例如 $.click),你可以检查事件本身是否被传递给函数:

var handleClick = function () {
    var $this = $(this); // obj

    if (arguments.length > 0 && arguments[0] instanceof jQuery.Event) {
        alert('called as callback');
    } else {
        alert('called directly');
    }
};

$('button').click(handleClick);
handleClick();
于 2013-07-29T19:44:18.673 回答
0

如果他们做不同的事情,你应该只有两种不同的方法。

如果您真的让该方法做同样的事情,无论它是作为方法还是回调调用,您都可以使用$.proxythis始终是对象:

function Object() {
    this.method = $.proxy( function(){

    }, this );
}
var obj = new Object();
于 2013-07-29T19:51:01.233 回答
0

thisinside的值method将是Object所有意图和目的的实例(参见 Rocket 的关于命名的评论)(除非该值是通过bind(),call()或有意设置的apply())。

当作为方法执行时, 的值this将是实例(同样,Object除非通过或更改)。bind()call()apply()

function Object() {
    var that = this;

    this.method = function(elem) {
        if (this !== that) {
            alert("we've got an event");
        } else {
            alert("it doens's seem to be an event");
        }
    }
}

你可以在这里看到这个工作http://jsfiddle.net/5WzEA/

于 2013-07-29T19:39:18.693 回答
0

如果要将函数绑定到上下文(对象),请使用以下内容:

function createOnClick(obj, fn) {
    return function() {
        return fn.apply(obj, arguments);
    }
}

myObject = new Object();

$('button').click(createOnClick(myObject, myObject.method));

现在,当您的方法被调用时,“this”将是对“myObject”实例的引用。这是众所周知的函数绑定,并且有许多 API 已经这样做了。但是,我对 JQuery 不熟悉,因此您需要参考文档。

于 2013-07-29T19:57:15.963 回答
0

这行得通。非常接近你所拥有的。

function Object() {
    this.method = function(elem) {
        console.log(elem)
        if (elem.length != 0 && elem instanceof jQuery.Event) {
            alert("Accessed on Click");
        } else {
            alert("Not accessed on click.");
        }
    }
}
var obj = new Object();


$('span').click(obj.method);  // Accessed on click.


obj.method($('div')); // Not accesed on click.

http://jsfiddle.net/dietrichg/3mELA/

于 2013-07-29T19:53:02.157 回答
0

确定这是否是回调的最佳方法是将不同的函数注册为回调并显式传递一个值以表明它确实是回调

function Object() {
    this.method = function(elem, isCallback) {
        if (isCallback) { 

        }
    } 
}

var obj = new Object();
$('span').click(function (elem) { obj.method(elem, isCallback); });
obj.method($('div'));
于 2013-07-29T19:54:54.183 回答
0

我认为这个选项更好:我从方法中删除了检查并且总是期望一个元素被传递。作为回调,我传递了接受“this”的函数,该函数将作为对元素的引用并传递给我的方法:

$('span').click(function(){obj.method(this)};
于 2013-07-30T14:05:30.460 回答