【发布时间】:2016-06-01 08:37:36
【问题描述】:
我正在阅读 You Don't Know JS: ES6 & Beyond 并发现一些令人困惑的措辞,例如:
我们声明一个
get(..)处理程序作为处理程序对象的命名方法(Proxy(..)的第二个参数),它接收对目标对象(obj)的引用,键属性名称("a") ,以及自己/接收者/代理 (pobj)。
我的问题是,上面的“接收者”是什么意思,它的名字从何而来?
好像我有一个带有成员函数“jump”的对象“a”:
var a = { jump: function() { console.log('jump!'); } };
如果我运行a.jump();,那么“a”就是接收者。
它是这样工作的吗?
对于阅读同一本书的人:当您来到Proxy First, Proxy Last部分时,您可以在代码中添加一行以更清楚地了解“get”陷阱中的上下文:
var handlers = {
get(target, key, context) {
console.log(greeter === context); //true, this line added
return function() {
context.speak(key + "!");
};
}
},
catchall = new Proxy({}, handlers),
greeter = {
speak(who = "someone") {
console.log("hello", who);
}
};
// setup `greeter` to fall back to `catchall`
Object.setPrototypeOf(greeter, catchall);
greeter.speak(); // hello someone
greeter.speak("world"); // hello world
greeter.everyone(); // hello everyone!
如你所见,由于上面“get”陷阱的第三个参数“context”的命名,接收者可以根据词法代码而变化——greeter.everyone();。请参阅下面 Oriol 的非常详细的答案以获得更好的理解。
【问题讨论】:
-
krave 正在谈论这本书:drive.google.com/file/d/0B_u1rzdqYCnzRUlHcV9sQVpTMFE/view 参见顶部的第 182 页。
-
在真正的书中,它在第 211 页
-
用正确的目标编辑在线资源。
-
我认为
receiver这个词来自消息传递风格。这只是意味着接收已传递消息的对象。a在这种情况下接收消息以处理jump方法等。
标签: javascript