我正在尝试让 KineticJS 与 Google Closure Compiler 一起使用。然而,KineticJS 根据变量的名称生成它的 getter 和 setter。
像这样的东西:
// add getter and setter methods
Kinetic.Node.addSetters = function(constructor, arr) {
for(var n = 0; n < arr.length; n++) {
var attr = arr[n];
this._addSetter(constructor, attr);
}
};
Kinetic.Node.addGetters = function(constructor, arr) {
for(var n = 0; n < arr.length; n++) {
var attr = arr[n];
this._addGetter(constructor, attr);
}
};
Kinetic.Node.addGettersSetters = function(constructor, arr) {
this.addSetters(constructor, arr);
this.addGetters(constructor, arr);
};
Kinetic.Node._addSetter = function(constructor, attr) {
var that = this;
var method = 'set' + attr.charAt(0).toUpperCase() + attr.slice(1);
constructor.prototype[method] = function() {
var arg;
if(arguments.length == 1) {
arg = arguments[0];
}
else {
arg = Array.prototype.slice.call(arguments);
}
var obj = {};
obj[attr] = arg;
this.setAttrs(obj);
};
};
Kinetic.Node._addGetter = function(constructor, attr) {
var that = this;
var method = 'get' + attr.charAt(0).toUpperCase() + attr.slice(1);
constructor.prototype[method] = function(arg) {
return this.attrs[attr];
};
};
// add getters setters
Kinetic.Node.addGettersSetters(Kinetic.Node, ['x', 'y', 'scale', 'rotation', 'opacity', 'name', 'id', 'offset', 'draggable', 'dragConstraint', 'dragBounds', 'listening']);
因此,使用 addGettersSetters 方法,您可以根据变量的名称生成 getter 和 setter。
然而,谷歌关闭无法解释这一点,并给出警告(不是错误,只是警告,但仍然......):警告 - 属性 setImage 从未在 Kinetic.Image 上定义
我可以为每个 getter 和 setter 添加外部变量。或者,我可以重写所有 getter/setter 的东西,手动使其成为实际的方法(非生成的方法)。最后一部分似乎是最好的,从那时起 Closure 可以优化它们并用它做一些魔法(我希望。)虽然这将是相当多的工作,所以我想知道,是否可以运行我的程序,所以它生成getter 和 setter,然后提取它们?或者,如果有人有更好的主意,那也欢迎。
谢谢!-巴勃罗