在多年使用JavaScript中的原型继承创建应用程序之后,我开始探索使用寄生继承。尽管它的主要缺陷-至少对我来说-在创建对象层次结构时可能会在内存中创建多个方法副本,但我发现它确实与我产生了共鸣,因为它的简单性和"new“被呈现为不必要的事实。然而,我被“这个”卡住了。我在网上看到的大多数示例只涉及到皮毛,展示了如何实现寄生继承,如下所示:
function foo() {
return {
method1 : function() {...}
}
}
function bar() {
var that = foo();
that.method2 = function() {
//is "this" pointing to bar()?
}
return that;
}正如我在bar()对象的注释中所问的," this“是指bar(),还是它的作用域被降级为method2?
谢谢!
发布于 2011-10-11 06:36:12
快速测试表明this正确引用了bar返回的对象
function foo() {
return {
method1 : function() { return "spam" }
}
}
function bar() {
var that = foo();
that.method2 = function() {
return this.method1();
}
return that;
}
var b = bar();
b.method2(); // "spam"发布于 2011-10-11 06:43:25
method2()中的this context variable将绑定到从foo()伪构造函数返回的对象。每个函数(上下文)都有一个绑定的this,来自上下文变量的值取决于方法本身的调用。
例如,从对象中调用一个函数作为属性(就像您在那里所做的那样)会将this variable设置为恰好是该对象。当您立即调用一个函数时,它的this被绑定到ES3中的global object和ES5中的null。
还有其他方法和关键字可以更改this中的值。比如new,.bind(),.call()和.apply()。但同样,在这里的特定代码片段中,this将绑定到存储在that中的对象。
https://stackoverflow.com/questions/7719387
复制相似问题