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

标签 javascript leaflet ecmascript-5

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

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

  • 这是 JavaScript getter 的一般行为吗?
  • 这是由 Leaflet 引起的(可能是其中的错误)?

不幸的是,我没有 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的那一行是this one在传单中。

最佳答案

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

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

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

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

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");
  },
});

关于Javascript getter - 为什么它在构造时被调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30197434/

相关文章:

javascript - 如何将 instanceof 与当前上下文中未定义的类一起使用?

javascript - 作为对象键访问时无法推断类型

javascript - 尝试使用 map 集群对具有相同坐标的标记进行分组

javascript - Node.js 全局 eval,抛出 ReferenceError

javascript - 为什么 JavaScript 函数的 toString 是实现依赖的?

javascript - 将内容动态添加到 Angular Promise 创建的元素中

javascript - C3 JS - 时间序列刻度反转格式

javascript - 无法使用 Java 在 Selenium WebDriver 中定位/填充文本框

javascript - 鼠标悬停图像保持不变

javascript - 整个世界的最大边界是多少? - 传单