我有一个类似于类的功能
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();
它没有按预期工作。 <{1}}由于某种原因等于self
。
我知道这是一个有点异常的编程,但可以做到吗?
关于使用window
的注意事项:我记得为什么我开始使用它。我想从方法内部的回调中引用基类(self
)。只要您尝试在方法中的函数中使用this
,它就会引用该方法,而不是基类。
答案 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
的引用可能会在你的脚下发生变化。