c# - javascript 对象中的成员可见性和 'this' 范围

标签 c# javascript

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

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

  1. 仅在对象的方法内部可见的私有(private)成员
  2. 在对象外也可见的公共(public)成员
  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();    

最佳答案

  • 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();   

关于c# - javascript 对象中的成员可见性和 'this' 范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16614105/

相关文章:

c# - DocumentDB 每次在大分页获取时返回不同的结果计数

c# - 如何向 FormattedString 添加新方法?

c# - Bot 在 MS TEAMS channel 中尝试发送自适应卡时抛出 "Operation returned an invalid status code ' RequestEntityTooLarge'”异常

c# - Metro - 编写异步 c# 操作并从 javascript 调用

javascript - WebGL 无法渲染

c# - 如何将一个本地字符串作为变量传递到另一个字符串的中间? .NET C#

javascript - array.find 不适用于 Babel

javascript - 为复选框列表项列表设置焦点

javascript - 循环遍历包含 n 个项目的数组

javascript - border-radius 在两个值之间使用斜杠 ("/")