我正在尝试使用类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未找到错误。但是,当我尝试将变量声明放在构造函数之外时,它就停止了工作。我也使用静态方法,因此如果没有一些工作,我就不能放弃类语法。我怎样才能解决这个问题?如何在对象内声明一个变量,这个变量是全局的,不能在外面找到?
答案 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中损坏原型。