背景:库对象具有旨在用作方法的属性,但程序员经常错误地将其作为属性访问-> 例如预期的界面:
this.filter(function(){...});
通常被错误地用作
this.filter=function(){...};
,它当然会覆盖该方法。 (哎哟)。
应对这种情况的第一个尝试是通过改变
this.filter = function(implementation) {
this.format = implementation;
this.isfilter = true;
}
到
Object.defineProperty(this, "filter", {
get: function() { return this.format; },
set: function(implementation) {
this.format = implementation;
this.isfilter = true;
}
});
对于错误的用例来说,这是件好事(this.filter = ...) 但当然是第一个(预期的情况是this.filter(function(){})) 不能再工作了。
在这种情况下,有什么办法可以实现多态?即同时处理 情况-a)不删除现有代码,并且b)要么,1)处理该分配,或者针对滥用情况发出警告/例外? 还是有一些关闭魔术可以做到这一点?
答案 0 :(得分:0)
这当然可以做到。
通过仅用get
属性替换该方法,将返回一个函数。
使用ES2015类:
class Filterable {
get filter() {
return (implementation) => {
this.format = implementation;
this.isfilter = true;
}
}
}
请注意,没有属性设置器。
尝试分配给该属性将失败,并在严格模式下抛出错误(始终使用严格模式!)
示例:
"use strict";
class Filterable {
get filter() {
return (implementation) => {
this.format = implementation;
this.isfilter = true;
}
}
}
const filterable = new Filterable();
filterable.filter(function (){}); // OK
filterable.filter = function () {}; // Error
当然,您不需要为此使用ES2015类,它将在您使用过它时与define属性一起使用。
Object.defineProperty(this, "filter", {
get: function () {
return function(implementation) {
this.format = implementation;
this.isfilter = true;
};
}
});