成员可见性和javascript对象中的“this”范围

时间:2013-05-17 16:43:44

标签: c# javascript

我仍然没有完全围绕对象定义和javascript中的this范围。我认为下面的(c#ish)伪代码很好地总结了它。

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

  1. 仅在对象方法中可见的私有成员
  2. 在对象外部也可见的公共成员
  3. 在实例化对象并初始化成员
  4. 时执行的(参数化)构造函数
  5. 在对象内部注册回调,指向对象本身的方法
  6. 当在方法(PrivateMethod)内执行回调时,可以访问对象实例的所有成员,最好使用this指针
  7. 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();    
    

3 个答案:

答案 0 :(得分:1)

这是一个link视频,其中来自Sencha的Doug Hendricks解释了JavaScript变量范围和常见的"执行上下文" (范围)在depht。

答案 1 :(得分:1)

  • public => this.
  • private =>构造函数内的局部变量/函数
  • 使用正确的this进行回调 - 使用bind或将this保存在本地变量中(methat是传统名称)。

类似于以下内容:

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