我仍然没有完全围绕对象定义和javascript中的this
范围。我认为下面的(c#ish)伪代码很好地总结了它。
如何定义一段创建具有以下所有属性的对象的javascript代码:
PrivateMethod
)内执行回调时,可以访问对象实例的所有成员,最好使用this
指针
class MyObjectDefinition
{
public int publicField = 0;
private int privateField;
public MyObjectDefinition(int parameter)
{
this.privateField = parameter;
SomethingThatWantsA.CallBack(this.PrivateMethod);
}
public void PublicMethod()
{
this.privateField--;
this.publicField--;
}
private void PrivateMethod()
{
this.privateField++;
this.publicField++;
}
}
var instance = new MyObjectDefinition();
答案 0 :(得分:1)
这是一个link视频,其中来自Sencha的Doug Hendricks解释了JavaScript变量范围和常见的"执行上下文" (范围)在depht。
答案 1 :(得分:1)
this.
this
进行回调 - 使用bind或将this
保存在本地变量中(me
或that
是传统名称)。类似于以下内容:
function MyObjectDefinition()
{
this.publicField = 0;
var that = this;
var privateField;
this.MyObjectDefinition = function(parameter)
{
privateField = parameter;
SomethingThatWantsA.CallBack(PrivateMethod);
}
this.PublicMethod = function()
{
privateField--;
// or that.publicField--; if you are paranoid/like consistency
this.publicField--;
}
function PrivateMethod()
{
privateField++;
that.publicField++;
}
}
var instance = new MyObjectDefinition();
答案 2 :(得分:0)
我稍微改变了Alexei's answer以摆脱我在构造函数中看到的问题。
function MyObjectDefinition(parameter)
{
this.publicField = 0;
var that = this;
var privateField;
this.PublicMethod = function()
{
privateField--;
this.publicField--;
}
if(parameter !== undefined)
{
privateField = parameter;
SomethingThatWantsACallBack(PrivateMethod);
SomethingThatWantsACallBack(this.PublicMethod);
}
function PrivateMethod()
{
privateField++;
that.publicField++;
}
}
我仍然不喜欢这个解决方案,因为我不能将所有构造函数逻辑放在class
的顶部。与PrivateMethod
不同,我必须先定义PublicMethod
才能使用它。