用原型方法回调

时间:2015-10-13 09:58:45

标签: javascript prototype

我遇到class.property问题。

    function myTuwas(){
        this.was = "tuwas";
    }
    myTuwas.prototype.setData = function(){
        console.log("tuwas", typeof this.was)
    }

    function myClass(){
        this.myVar = "hello";
    }
    myClass.prototype.setData = function(callback){
        console.log(typeof callback);
        callback();
    }

    var myInst = new myClass();
    var myInstTuwas = new myTuwas();
    myInst.setData(myInstTuwas.setData);

如果我调用myInstTuwas.setData而不是this.was被定义,但是如果使用myInstTuwas.setData作为参数并将其用作回调函数 在myInst.setData中比this.was未定义。我做错了什么?

2 个答案:

答案 0 :(得分:0)

上下文取决于代码如何调用函数:

function myTuwas(){
    this.was = "tuwas";
}
myTuwas.prototype.setData = function(){
    console.log("tuwas", typeof this.was)
}

这里你定义了一个名为myTuwas的“类”,它有一个方法“setData”,所以下面的代码按预期工作:

var temp= new myTuwas();
temp.setData();

但它的工作原理是因为当您使用格式“variable.function()”调用函数时,Javascript会自动将“this”设置为变量。 另一方面,这段代码,它将无法按预期工作:

var temp= new myTuwas();
var setData= temp.setData;
setData();

因为在这个调用中没有引用句子中的对象,所以没有定义“this”。在严格模式下,这将是undefined。如果您未处于严格模式,则这将是全局上下文(浏览器中为this === window)。实际上,这与此代码具有相同的结果,直接从原型中获取函数:

var setData=myTuwas.prototype.setData;
setData();

如何解决?将对象和回调函数传递给myClass.setData函数并使用callapply

function setData(context,callbackFn) {
    callbackFn.apply(context);
}

答案 1 :(得分:0)

将上下文传递给回调函数。

myClass.prototype.setData = function(callback,ctx){
    console.log(typeof callback);
    callback.call(ctx);
}

//设置数据时

myInst.setData(myInstTuwas.setData, myInstTuwas);