javascript - 如何使用 Object.defineProperty 方法自定义 Array 在 JavaScript 中的行为方式?

标签 javascript

我想通过使用 Object.defineProperty 方法改变 Array 的行为方式。

我知道这不是一件好事。这仅用于实验目的。

例如,如果我有一个数组[1, 2, 3],当我使用console.log([1, 2, 3])时,我希望输出结果为[2, 4, 6]

再一次,我知道这是一件疯狂的事情!但是,我想了解它是如何工作的,以便更深入地理解 JavaScript。

'use strict';

Object.defineProperty(
  Array.prototype,
  Symbol.iterator, //should this be `this` instead?
  {
    value: function*() {
      yield 'what should I do here ???';
    }
  }
)

console.log([1, 3]) // expect this result to be [2, 6]

谢谢! - 我的最终代码

谢谢!! @Ry,@vol7ron

'use strict';

(function() {
    let originalIterator = Array.prototype[Symbol.iterator];

    Object.defineProperty(
        Array.prototype, 
        Symbol.iterator, 
        {
            value: function* () {
                for (let x of originalIterator.call(this)) {
                    yield 2 * x;                
                }
            }
        }   
    )

})();

console.log([...[1, 3]]);

最佳答案

console.log 不使用迭代器迭代来显示您的数组。不过,您已经在该示例中成功覆盖了它,正如您可以看到使用迭代器的东西,例如数组文字传播 [...[1, 3]]

简化:

'use strict';

let originalIterator = Array.prototype[Symbol.iterator];

Array.prototype[Symbol.iterator] = function* () {
  for (let x of originalIterator.call(this)) {
    yield 2 * x;
  }
};

console.log([...[1, 3]]);

关于javascript - 如何使用 Object.defineProperty 方法自定义 Array 在 JavaScript 中的行为方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49703332/

相关文章:

javascript - 如何为元素及其边框设置不同的光标

javascript - HTMLCollection 出现在包含许多元素但长度为 0 的控制台中

javascript - 将日期格式从数字更改为字母

javascript - 在 HTML/JS 中禁用/阻止自动完成

javascript - 仅在 Dropbox 中存储文件时,Datastore 和核心 API 之间的区别?

javascript - 显示/隐藏 Div 组合 jQuery

javascript - 如何在 jQuery 中选择具有 this 匹配属性的所有元素?

javascript - 如何使这段代码更简单或缩短?

Javascript/Jquery : Using + sign on a string.

javascript - JQuery 通过键从 json 中获取值