【问题标题】:Javascript assigning class scope to local variable ineffectiveJavascript将类范围分配给局部变量无效
【发布时间】:2013-04-30 15:46:13
【问题描述】:

我首先在这个网站上发现了这个想法:

http://theburningmonk.com/2011/01/javascript-dynamically-generating-accessor-and-mutation-methods/

重点是给类作用域分配一个局部变量来设置动态类属性。

在这段代码中,我设置了一个局部变量 _this 等于类范围。但是由于某种原因,_this 的属性可以在类之外访问。为什么是这样? _this 在创建时被声明为私有成员。

var MyClass = function( arg )
{
var _this = this;
_this.arg = arg;

// Creates accessor/mutator methods for each private field assigned to _this.
for (var prop in _this)
{
    // Camelcases methods.
    var camel = prop.charAt(0).toUpperCase() + prop.slice(1);

    // Accessor
    _this["get" + camel] = function() {return _this[prop];};

    // Mutator
    _this["set" + camel] = function ( newValue ) {_this[prop] = newValue;};
}
};

var obj = new MyClass("value");
alert(obj.getArg());

这怎么会运行?它会提醒“价值”。这不应该是可访问的,因为 _this 是私下声明的。当我写这篇文章时,我做错了修改器/访问器分配;我还是这样。

我打算写这个,将这些方法分配给类范围:

    // Accessor
    this["get" + camel] = function() {return _this[prop];};

    // Mutator
    this["set" + camel] = function ( newValue ) {_this[prop] = newValue;};

但两者都可以。为什么 _this 的私有方法可用?

任何帮助都会很棒!

谢谢, 困惑的脚本家

【问题讨论】:

    标签: javascript class accessor mutators


    【解决方案1】:

    _this 的值只是this 的一个副本,所以两者都会引用新创建的对象。可用的是对象本身。

    换句话说,一个对象的引用与另一个对象一样好。在您的代码中,有三个:

    1. this,在构造函数内
    2. _this,也在构造函数内部
    3. obj,作为new 表达式的结果,它被分配了对同一对象的引用。

    在较新的 JavaScript 实现中,可以隐藏属性,但该隐藏适用于全局。 JavaScript 没有 C++ 或 Java 等语言所具有的“类范围”。

    【讨论】:

    • 所以当我创建 _this.property1 时,我正在创建 this.property2?有没有办法解决这个问题?
    • 当您创建_this.property1 时,您将在变量_this 引用的对象上创建一个名为“property1”的属性。这与this 所指的对象相同,所以是的。可以创建对象的只读属性,但它们对所有内容都是只读的,包括与对象的其他属性关联的方法。
    • 也许如果你解释了你想要达到的目标,我(或某人)可以提供更详细的指导。
    • 我很抱歉。我不是想取得任何成就。我只是对 Javascript 的这个方面感到困惑。我并不完全满意,但你确实回答了我原来的问题。我进一步的不满超出了这个问题的范围。所以谢谢你!
    猜你喜欢
    • 2018-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-20
    • 2022-01-12
    • 1970-01-01
    • 2012-11-05
    相关资源
    最近更新 更多