我正在编写一个库,希望在高级模式下与 Closure Compiler 兼容。库中的大多数对象都维护一个内部属性对象,这些属性通常是 API 的一部分,这导致我的源文件充满了很多这样的函数。
/*
* Get name.
*/
Layer.prototype.getName = function() {
return this.attrs.name;
}
/*
* Set name.
*/
Layer.prototype.setName = function(name) {
this.attrs.name = name;
}
我可以想出十亿种方法来优化它,以稍微整理一下我的代码。一个例子:KineticJS,根据这个相关的问题,做了一些像这样的事情:
Global.addGettersSetters = function(obj, property) {
obj['get'+property] = function() { return this.attrs[property] }
obj['set'+property] = function(val) { this.attrs[property] = val }
}
// Later that day, in our original object, we have:
Global.addGettersSetters(Layer, 'name');
我的理解是,这对于 Closure Compiler 是一个禁忌——名称不会被缩短,函数也不会被优化,因为我将 Layer 的属性指定为字符串。
那么,有没有一种方法可以让我完全正确地定义接口而不会弄乱我的代码?也许我忽略了闭包库中的某些东西?
另一种解决方案:有没有办法在现代 JS 中实现 C# 风格的属性?Closure Compiler 在某种程度上认为是允许的?我有幸针对 Webkit 并且只有带有这个库的 Webkit,所以还没有完全实现的东西很好。