0

我有一个类功能

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

要从方法内部引用,函数中myapp的第一行是myapp

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();

它没有按预期工作。出于某种原因self等于。window

我知道这有点不正常的编程,但可以做到吗?


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

4

2 回答 2

2

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

var myapp = function() {

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

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

}
于 2013-10-23T02:24:28.943 回答
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是,不管你如何调用你的方法,因为你总是this在创建时通过self变量引用。你不必这样写,但你应该明白引用this可能会在你的脚下发生变化。

于 2013-10-23T02:42:38.733 回答