关于defineProperty

function Archiver() {
  var temperature = null;
  var archive = [];

  Object.defineProperty(this, 'temperature', {
    get: function() {
      console.log('get!');
      return temperature;
    },
    set: function(value) {
      temperature = value;
      archive.push({ val: temperature });
    }
  });

  this.getArchive = function() { return archive; };
}

var arc = new Archiver();
arc.temperature; // 'get!'
arc.temperature = 11;
arc.temperature = 13;
arc.getArchive(); // [{ val: 11 }, { val: 13 }]

有大神解释下这4个输出是怎么来的吗?
请输入代码

阅读 1.8k
2 个回答

这里用到了数据的访问器属性,可以百度一下,这里我简单说一下你这块代码的原理。
首先我们定义了一个构造函数,里边的this指向的是构造函数的实例。
之后,将实例的属性设置为访问器属性。这样,获取这个属性的值时,会自动调用get方法,当给这个属性设置值时,会自动调用set方法。这就是访问器属性的作用。
接下来说后边的结果,创建构造函数的实例后,第一个属于获取属性的值,就会调用get,第二个和第三个是设置属性的值,就会调用set。
前边说到,this指向实例,所以实例有一个数组,两次set都会往这个数组中push值,所以最后一个才会有一个数组,数组中的值就是两次set中的值。

defineProperty 挟持了Archivertemperature属性 监听调用和赋值操作

  1. 控制台输出get 是因为调用了get方法
  2. 赋值操作 调用 set方法 在set方法内 将temperature 的值pusharchive
  3. 同2
  4. 调用getArchive方法 返回数组archive的值
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题