如何设置var self = this;从功能外?

时间:2013-10-23 02:18:42

标签: javascript

我有一个类似于类的功能

var myapp = function() {
    this.method = function() {
        //Do something...
    }
}

要从方法中引用myappmyapp函数中的第一行是

var self = this;

因此myapp中的方法可以安全地引用“类”

this.anothermethod = function() {
    self.method();
}

完整代码:

var myapp = function() {
    var self = this;

    this.dosomething = function(Callback) {
        Callback();
    }

    this.anothermethod = function() {
        //Pass a callback ("self" is required here)...
        this.dosomething(function() { 
            self.complete(); 
        )};
    }

    this.complete = function() {
        console.log('All done!');
    }
}

我的问题是:我可以从外面分配var self = this; myapp的声明吗?我每次写“课”时都不想设置self

有点像这样:

var library = function() {
    this.loadclass = function(Name) {
        var tempclass = window[Name];

        library[Name] = new tempclass();

        library[Name].self = library[Name];
    }
}

var myapp = new library();

myapp.loadclass('myapp');

myapp.myapp.dosomething();

它没有按预期工作。 <{1}}由于某种原因等于self

我知道这是一个有点异常的编程,但可以做到吗?


关于使用window的注意事项:我记得为什么我开始使用它。我想从方法内部的回调中引用基类(self)。只要您尝试在方法中的函数中使用this,它就会引用该方法,而不是基类。

2 个答案:

答案 0 :(得分:2)

除非您从对象中分离方法并将它们作为普通函数调用,否则根本不需要self变量。该方法可以使用this关键字

来访问其对象
var myapp = function() {

  this.method = function() {
    //Do something...
  }

  this.anothermethod = function() {
    this.method();
  }

}

答案 1 :(得分:1)

不,你不能真的;不是你至少创造对象的方式。

您可以通过枚举对象上的所有函数并将它们绑定到对象本身来实现此目的。像这样:

Object.keys(obj)
  .filter(function(n) { return typeof obj[n] == "function" })
  .forEach(function(n) { obj[n] = obj[n].bind(obj) })

此函数将覆盖obj的公共可枚举属性,并确保其上的任何函数都绑定到obj;即this现已绑定到obj


this

上的引物

当你调用new时,构造函数中的this绑定到新创建的对象。如果你确实需要在构造函数时绑定this的引用,那么你需要保留对它的引用。

JavaScript中的函数绑定到调用的任何位置。这是一个例子:

var foo = new function() {
  this.bar = function() {
    return 'bar'
  }

  this.baz = function() {
    return this.bar()
  }
}

console.log(foo.bar()) // bar
console.log(foo.baz()) // bar

var bar = function() {
  return "window"
}

var baz = foo.baz

console.log(baz()) // window

当我们致电foo.baz()时,它会向foo寻求bar的实施,但在通过“分离”引用调用foo.baz时,它会看起来无论全局对象是什么(在这种情况下是浏览器窗口对象)并从那里调用bar。因为我们在全局上下文中定义了bar,所以它返回window

分配名为self的变量的做法是,无论您如何调用方法都无关紧要,因为您在创建时始终通过{{1}引用this变量。你不必以这种方式写东西,但是你应该明白,self的引用可能会在你的脚下发生变化。