getters 和 setter

2019-05-24  本文已影响0人  SingleDiego

上一节我们设置了私有属性与方法,但它们现在无法在对象外部访问。假如我们想在外部获取 dafaultLocation 该怎么做呢?

我们用 Object.defineProperty 方法设置能访问的属性:

function Circle(radius) {
  this.radius = radius;

  let defaultLocation = {x: 0, y: 0};

  this.draw = function() {
    console.log('draw');
  };

  Object.defineProperty(this, 'defaultLocation', {
    get: function() {
      return defaultLocation;
    }
  })
};

我们可以像访问属性那样使用它:

const circle = new Circle(1);
circle.defaultLocation;
// {x: 0, y: 0}

同时 defaultLocation 现在是只读属性,并不能从外部修改。

如果需要从外部修改属性,那么需要一个 set 方法:

function Circle(radius) {
  this.radius = radius;

  let defaultLocation = {x: 0, y: 0};

  this.draw = function() {
    console.log('draw');
  };

  Object.defineProperty(this, 'defaultLocation', {
    get: function() {
      return defaultLocation;
    },
    set: function(value) {
      if (!value.x || !value.y)
        throw new Error('Invalid Location!')
      defaultLocation = value;
    }
  })
};

还是像使用属性那样操作,参数不合法将有报错:

const circle = new Circle(1);
circle.defaultLocation = {x: 2, y: 2};

circle.defaultLocation = 1;
// Uncaught Error: Invalid Location!
上一篇 下一篇

猜你喜欢

热点阅读