类外的类变量

时间:2017-04-06 12:55:23

标签: javascript oop ecmascript-6

让我们说我有这样的课程

class Vector {
    constructor(x,y) {
        this.x = x
        this.y = y
    }
}

我该怎么做呢?

class Vector {
    constructor() {
    }
    var x;
    var y;
}
var v = new Vector()
v.x = 3
v.y = 4

我基本上想在构造函数之外声明我的变量。做了一些研究。什么都没找到

2 个答案:

答案 0 :(得分:2)

我猜你在谈论Property Initialiazers

如果稍微修改一下,您的代码可以正常工作:

class Vector {
    constructor() {}

    x = 1;
    y = 2;
}

var v = new Vector();

console.log(v.x, v.y); // 1 2

v.x = 3
v.y = 4

console.log(v.x, v.y); // 3 4

请注意,目前这是stage-2 proposal,所以它无法在任何开箱即用的浏览器中使用。

如果你正在使用babel ,你可以使用transform-class-properties插件。

如果你没有使用babel ,你可以使用一些替代品 - 它们已在this question中讨论过。

答案 1 :(得分:1)

您可以在创建实例后分配属性:

class Vector {
  constructor() {
    this.x = null;
    this.y = null;
  }
}

let v = new Vector();

v.x = 1;
v.y = 2;

console.log(v.x, v.y); // 1 2

您可以使用getset定义属性,如下所示:

class Vector {
  constructor() {
    this.xValue = null;
    this.yValue = null;
  }
  get x() {
    return this.xValue;
  }
  set x(newVal) {
    this.xValue = newVal;
  }
  get y() {
    return this.yValue;
  }
  set y(newVal) {
    this.yValue = newVal;
  }
}

let v = new Vector();

v.x = 1;
v.y = 2;

console.log(v.x, v.y); // 1 2

第二种方法允许您在设置之前操纵新值。

示例:

class Vector {
  constructor() {
    this.xValue = null;
    this.yValue = null;
  }
  get x() {
    return this.xValue;
  }
  set x(newVal) {
    this.xValue = `The value of 'x' is ${newVal}.`;
  }
  get y() {
    return this.yValue;
  }
  set y(newVal) {
    this.yValue = `The value of 'y' is ${newVal}.`;
  }
}

let v = new Vector();

v.x = 1;
v.y = 2;

console.log(v.x, v.y); // The value of 'x' is 1. The value of 'y' is 2.