Javascript getter - 为什么在构造时调用它?
Javascript getter - why does it get called at construction?
我是 Javascript getters/setters 的新手,但想在基于 Leaflet 和 browserify 的项目中使用它们。有惊喜。
getter 在 class 自己的 initialize
方法(Leaflet 构造回调)到达 [=55= 之前,出于某种我不知道的原因,在初始化时被调用].这当然意味着成员未定义并且全部分解。这是为什么?
- 这是 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的行在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");
},
});
我是 Javascript getters/setters 的新手,但想在基于 Leaflet 和 browserify 的项目中使用它们。有惊喜。
getter 在 class 自己的 initialize
方法(Leaflet 构造回调)到达 [=55= 之前,出于某种我不知道的原因,在初始化时被调用].这当然意味着成员未定义并且全部分解。这是为什么?
- 这是 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的行在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");
},
});