1

我还没有完全理解对象定义和thisjavascript 中的范围。我认为下面的 (c#ish) 伪代码很好地总结了它。

如何定义一段 javascript 代码来创建具有以下所有属性的对象:

  1. 仅在对象的方法内可见的私有成员
  2. 在对象外也可见的公共成员
  3. 实例化对象并初始化成员时执行的(参数化)构造函数
  4. 在指向对象本身的方法的对象内注册回调
  5. 当回调在方法(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();    
4

3 回答 3

1

这是一个视频链接,来自 Sencha 的 Doug Hendricks 详细解释了 JavaScript 变量范围和常见的“执行上下文”(范围)。

于 2013-05-17T17:13:24.757 回答
1
  • 公开 =>this.
  • private => 构造函数内的局部变量/函数
  • 正确的回调this- 使用绑定或保存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();   
于 2013-05-17T17:14:30.610 回答
0

我已经稍微改变了阿列克谢的答案,以摆脱我在构造函数中看到的问题。

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才能使用它。

于 2013-05-21T09:28:04.883 回答