javascript - JavaScript 属性查找规则有哪些异常(exception)?

标签 javascript inheritance prototype getter-setter

以下代码演示了 JavaScript 中属性查找的“标准”规则。它创建一个空对象a,其原型(prototype)包含属性i。读取 a.i 给出原型(prototype)中的值,但写入 a.i 会在对象本身中创建一个新属性:

function A() {}
A.prototype = { i: 1 }
a = new A();

console.log(a.i, a.hasOwnProperty('i'));  // 1 false
a.i = 2
console.log(a.i, a.hasOwnProperty('i'));  // 2 true

但是,如果我们在原型(prototype)中有一个 setter,则行为会有所不同。现在,编写 a.i 会调用 setter,而不是直接写入对象:

function A() {}
A.prototype = { set i(value) { this._i = value }, _i: 1 }
a = new A();

console.log(a.i, a.hasOwnProperty('i'));  // undefined false
console.log(a._i, a.hasOwnProperty('_i'));  // 1 false
a.i = 2
console.log(a.i, a.hasOwnProperty('i'));  // undefined false
console.log(a._i, a.hasOwnProperty('_i'));  // 2 true

原型(prototype)中 setter 的存在完全改变了写入 a.i 时发生的情况。是否有任何其他语言功能会改变访问属性时发生的情况?具体来说,除了存在 setter 之外,写入总是直接更新对象吗?

最佳答案

一个异常(exception)是,如果您的对象是代理,它允许您拦截对该对象的所有属性调用,并且您可以获得被调用的属性的名称。您还可以控制许多其他行为。所以你可以这样做

const target = {};
const proxyHandler = {
    set(target, property, value, receiver) {
         //gets called on any setter operation
    }
};
const proxy = new Proxy(original, proxyHandler );

这里有更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy

关于javascript - JavaScript 属性查找规则有哪些异常(exception)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46646653/

相关文章:

javascript - 如何获取一个 div 的高度并将另一个 div 设置为与 JQuery/Javascript 相同的高度

javascript - 输入值到对象数组

数组中的 JavaScript 方法

c# - 在方法中传递对派生对象的引用时出错

javascript - 理解 Javascript 的 OOP : instances modifying other instances

javascript - 构造函数原型(prototype)循环引用 JavaScript

javascript - 只删除周围的单引号?

c++ - 在派生类的构造函数中初始化没有默认构造函数的基类

inheritance - 在 sqlalchemy 中使用版本控制和多级继承时遇到问题

javascript - 使用 TypeScript 扩展 Object.prototype