Javascript getter - 为什么在构造时调用它?

Javascript getter - why does it get called at construction?

我是 Javascript getters/setters 的新手,但想在基于 Leaflet 和 browserify 的项目中使用它们。有惊喜。

getter 在 class 自己的 initialize 方法(Leaflet 构造回调)到达 [=55= 之前,出于某种我不知道的原因,在初始化时被调用].这当然意味着成员未定义并且全部分解。这是为什么?

不幸的是,我没有 jsfiddle 来展示这个 - 这可能是由于 Leaflet,或者是由于 node.js 我所做的模块化构建(通过 browserify)。

代码如下:

/*
 * Temp.js
 */
"use strict";

module.exports = L.Class.extend( {

  initialize: function () {
    console.log("initialized");
  },

  // --- Public methods ---

  get some () {
    console.log("getter");
    return 42;
  },

  set some (v) {
    console.log("setter: "+v);
  }

});

调用代码:

// this just for experiments
//
var Temp = require('./src/Temp.js');
var xxx = new Temp();

产生输出:

[Log] getter (out.js, line 2102)
[Log] initialized (out.js, line 2096)

所以:get 可以叫什么?

使用:Safari 8.0.6 (OS X),Leaflet 当前 master,Browserify 10.1.0

附录:

调试,调用getter的行在Leaflet中是this one

我不能代表 Leaflet,但是 通常 extend 的实现有一个看起来像这样的循环:

var propertyName;
for (propertyName in source) {
    dest[propertyName] = source[propertyName];
}

如您所见,在您调用 extends 读取 属性 的值(并存储结果值,而不是 getter 函数)。

您需要查看文档,但我怀疑 L.Class.extend 是否与 getters/setters 兼容。您可能需要在 initialize 中定义那些 getters/setters,例如:

var somePropDef = {
  get: function() {
    console.log("some getter");
    return 42;
  },
  set: function(v) {
    console.log("some setter: "+v);
  }
};
module.exports = L.Class.extend( {

  initialize: function () {
    Object.defineProperty(this, "some", somePropDef);
    console.log("initialized");
  },
});