说我有一个对象,obj有一些方法和一些吸气剂:
var obj = {
method1: function(a) { /*...*/ },
method2: function(a, b) { /*...*/ },
}
Object.defineProperty(obj, "getter1", {get:function() { /*...*/ }});
Object.defineProperty(obj, "getter2", {get:function() { /*...*/ }});
Run Code Online (Sandbox Code Playgroud)
obj是可链接的,链条将定期包括方法和吸气剂:( obj.method2(a,b).getter1.method1(a).getter2例如).
我知道这个链接使用getter有点奇怪,在大多数情况下可能是不可取的,但这不是一个普通的js应用程序(它适用于DSL).
但是,如果(出于某种原因)我们想要执行这些链式方法/ getter真的很懒散呢?比如,只有在调用某个"最终"getter /方法时才执行它们?
obj.method2(a,b).getter1.method1(a).getter2.execute
Run Code Online (Sandbox Code Playgroud)
在我的例子中,这个"最终"方法toString可以由用户显式调用,或者在他们尝试将其连接到字符串时隐式调用(valueOf也触发评估).但是我们将使用executegetter示例来保持这个问题的广泛性,并希望对其他人有用.
所以这里的想法是:代理obj并简单地将所有getter调用和方法调用(及其参数)存储在一个数组中.然后,当execute在代理上调用时,以正确的顺序将所有存储的getter /方法调用应用于原始对象并返回结果:
var p = new Proxy(obj, {
capturedCalls: [],
get: function(target, property, receiver) {
if(property === "execute") {
let result = target;
for(let call …Run Code Online (Sandbox Code Playgroud)