在JavaScript中,接收器是一个对象,用于接收和处理从其他对象发送过来的消息或数据。接收器可以是函数、方法或对象。它通常用于实现事件处理、回调函数或消息传递等功能。接收器可以通过调用函数、调用方法或访问对象的属性来处理接收到的消息或数据。

7 浏览
0 Comments

在JavaScript中,接收器是一个对象,用于接收和处理从其他对象发送过来的消息或数据。接收器可以是函数、方法或对象。它通常用于实现事件处理、回调函数或消息传递等功能。接收器可以通过调用函数、调用方法或访问对象的属性来处理接收到的消息或数据。

我正在阅读《You Don't Know JS: ES6 & Beyond》,发现一些用词不清晰的地方,比如:

我们在处理器对象(作为`Proxy(..)`的第二个参数)中声明了一个名为`get(..)`的处理器,它接收到了目标对象(`obj`)、键属性名(`"a"`)和self/receiver/proxy(`pobj`)的引用。

我的问题是,上面的“receiver”是什么意思,它的名称从哪里来?看起来好像如果我有一个名为“a”的对象,其中有一个成员函数“jump”:

var a = { jump: function() { console.log('jump!'); } };

如果我运行a.jump();,那么“a”就是receiver。是这样工作的吗?

对于阅读同一本书的人:当你到达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),
var 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的非常详细的答案。

0