如何在javascript中将变量范围限定为类

时间:2017-03-23 20:46:46

标签: javascript

我正在尝试使用类foo {}语法创建一个类,并希望在其中包含一个私有变量。现在,我有这样的事情:

'use strict';
class foo {
  constructor(x1,y1) {
    var x = x1;
    var y = y1;
  }
  get x() {
    return x;
  }
  get y() {
    return y;
  }
}

每当我尝试访问foo.x和foo.y时,我都会发现x未找到错误。但是,当我尝试将变量声明放在构造函数之外时,它就停止了工作。我也使用静态方法,因此如果没有一些工作,我就不能放弃类语法。我怎样才能解决这个问题?如何在对象内声明一个变量,这个变量是全局的,不能在外面找到?

3 个答案:

答案 0 :(得分:4)

这些getter在原型上声明,他们无法访问构造函数中的私有(作用域)变量。您需要使用Object.defineProperty来创建特定于实例的getter:

class Foo {
  constructor(x, y) {
    Object.defineProperties(this, {
      x: {get() { return x; }, configurable: true},
      y: {get() { return y; }, configurable: true}
    });
  }
}

这与ES5没什么不同。顺便说一句,如果你没有分配变量,你可能会把它们变成不可写的属性。

答案 1 :(得分:1)

人们假设你想要使用getter和setter。如果情况并非如此,那就足够了:



'use strict';
class foo {
  constructor(x1,y1) {
    this.x = x1;
    this.y = y1;
  }
}

var f = new foo(10, 20);

console.log(f.x)
console.log(f.y)




JSFiddle:https://jsfiddle.net/gLxnqfrv/

答案 2 :(得分:0)

取自es6-features这是一个类及其获取者和设置者的正确语法。

class Rectangle {
    constructor (width, height) {
        this._width  = width
        this._height = height
    }
    set width  (width)  { this._width = width               }
    get width  ()       { return this._width                }
    set height (height) { this._height = height             }
    get height ()       { return this._height               }
    get area   ()       { return this._width * this._height }
}
var r = new Rectangle(50, 20)
r.area === 1000

重要的是要注意,不要求在ES6中损坏原型。