gpt4 book ai didi

javascript - JavaScript 中的接收器是什么?

转载 作者:行者123 更新时间:2023-12-03 12:18:04 25 4
gpt4 key购买 nike

我正在阅读 You Don't Know JS: ES6 & Beyond并发现了一些令人困惑的措辞,例如:

We declare a get(..) handler as a named method on the handler object (second argument to Proxy(..)), which receives a reference to the target object (obj), the key property name ("a"), and the self/receiver/proxy (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),
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 的非常详细的答案以获得更好的理解。

最佳答案

接收者是发生属性查找的对象。

所以是的,如果你使用 a.jump , a是接收者。

仅当发生该属性查找时您可以执行任意代码时,该概念才有意义。基本上,这意味着:

  • 访问器属性。

    您可以使用 this 访问接收器在 getter 或 setter 中。接收者通常是您定义属性的对象,或从它继承的另一个对象。
    var target = {
    get getReceiver() { return this; }
    };
    target.getReceiver; // target
    var inherits = Object.create(target);
    inherits.getReceiver; // inherits

    内置示例是 __proto__ ,定义为 Object.prototype 的属性但预计会在其他对象(接收器)上获取或设置。
  • 代理对象

    代理对象允许您定义 getset陷阱,当您尝试获取或设置代理的任何属性时,它会运行一个函数。接收器作为该函数的参数提供。接收者通常是 Proxy 对象本身,或从它继承的对象。
    var proxy = new Proxy({}, {
    get: function(target, property, receiver) {
    return receiver;
    }
    });
    proxy.getReceiver; // proxy
    var inherits = Object.create(proxy);
    inherits.getReceiver; // inherits

  • 请注意,您可以使用 Reflect.get Reflect.set 指定任意接收者:
    Reflect.get(target, "getReceiver", arbitraryValue); // arbitraryValue ¹
    Reflect.get(proxy, "getReceiver", arbitraryValue); // arbitraryValue

    ¹ 如果 getter 是在非严格模式下定义的,它将是 Object(arbitraryValue) .

    “接收器”的名称来自规范,见 Object Internal Methods and Internal Slots

    • [[Get]]   (propertyKey, Receiver) → any

      Return the value of the property whose key is propertyKey from this object. If any ECMAScript code must be executed to retrieve the property value, Receiver is used as the this value when evaluating the code.

    • [[Set]]   (propertyKey, value, Receiver) → Boolean

      Set the value of the property whose key is propertyKey to value. If any ECMAScript code must be executed to set the property value, Receiver is used as the this value when evaluating the code. Returns true if the property value was set or false if it could not be set.

    关于javascript - JavaScript 中的接收器是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37563495/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com