我首先在这个网站上找到了这个想法:
http://theburningmonk.com/2011/01/javascript-dynamically-generating-accessor-and-mutation-methods/
重点是将一个局部变量赋给类范围以设置动态类属性。
在这段代码中,我设置了一个等于类范围的局部变量_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());
为什么会这样?它会提醒“价值”。这不应该是可访问的,因为_这是私有声明的。当我写这篇文章时,我做了mutator / accessor赋值错误;或者我不过。
我打算写这个,将这些方法分配给类范围:
// Accessor
this["get" + camel] = function() {return _this[prop];};
// Mutator
this["set" + camel] = function ( newValue ) {_this[prop] = newValue;};
但要么工作。为什么这个'私人方法可用?
任何帮助都会很棒!
谢谢, 困惑的Scripter
答案 0 :(得分:1)
_this
的值只是this
的副本,因此两者都将引用新创建的对象。它是可用的对象本身。
换句话说,对一个对象的一个引用和另一个对象一样好。在您的代码中,有三个:
this
,位于构造函数_this
,也在构造函数obj
,作为new
表达式的结果,分配了对同一对象的引用。在较新的JavaScript实现中,可以隐藏属性,但隐藏适用于全局。 JavaScript没有类似C ++或Java等语言的“类范围”。