JavaScript中的Getter和Setter

5
我开始学习JavaScript,尤其是面向对象编程模式。
我的问题很简单。在setter中,有没有办法为参数和私有类变量保持相同的名称?我已经到处寻找,但找不到任何人提到它,只有使用不同变量名的示例。我对我的代码非常挑剔,不想给它两个不同的名称。
http://ejohn.org/blog/javascript-getters-and-setters/的示例为例。
function Field(val){
    this.value = val;
}
Field.prototype = {
    get value(){
        return this._value;
    },
    set value(val){
        this._value = val;
    }
};

您可以在setter中看到参数是val,但属性实际上是value。由于这是javascript,我不能简单地使用this.value=value,因为"this"会使它变成公共的。value=value会同时引用参数(这很奇怪)。真的没有其他方法可以做到这一点吗?如果没有,那么在这种情况下是否有任何“最佳实践”?我猜划线符可能是有效的,但我只是挑剔,所以只想确保没有其他办法。

谢谢!

2个回答

5
您可以使用闭包来隐藏变量。
function MyClass {
  var value;

  this.getValue = function() {
    return value;
  }

  this.setValue = function(val) {
    value = val;
  }

}

在构造函数 MyClass 完成后, value 字段将不可访问,因为它仅作用于此构造函数(函数)的范围内。因此,我们可以说 value 是一个私有字段。但是, getValue() setValue()方法可以从构造对象公开访问,并且它们保留对 MyClass 的变量作用域的引用,因此它们仍然可以操作 value

原型虽然很好,而且速度也很快。 - Alex Wayne
闭包非常有趣,谢谢!但是,问题是关于在参数和类变量的setter中使用相同的变量名,但在你的示例中仍然必须使用不同的变量名。如果可能的话,我正在寻找一种同时使用相同名称的方法。就像在Java中这样:this.variable-variable(两者都称为variable,但第一个是指类变量,第二个是指参数)。 - martinvigo
@AlexWayne 当然可以,但你不能在原型中声明“hidden”变量... 这里的诀窍在于构造函数是一个函数,它具有变量作用域,在函数完成后仍然保留在内存中。原型只是一个对象。另外,原型如何快速?它们节省内存,而不是时间。 - Imp
1
@yowie 当然,名称必须更改,因为没有办法区分变量和参数。一旦您使用this作为变量,变量就不会被隐藏。现在我想不出如何为它们使用相同的名称...但是,有一种方法可以根本不提及参数名称:this.setValue = function() { value = arguments[0]; };。参数对象在所有函数内部定义,保留传递给函数的参数数组和其他一些有趣的东西。 - Imp
我的问题现在得到了解答,除此之外别无他法,但我可以按照你的建议去做。谢谢@lmp。 - martinvigo

1

使用闭包:

(function(exports){

    exports.field = {};
    var _value = '123';

    exports.field.get = function(){
        return _value;
    }

    exports.field.set = function(val){
        _value = val;
    }

})(window);

console.log(field.get());

这里有一个关于JS中闭包的好教程。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接