在所有全局对象原型上设置一个方法

Set a method on all global object prototypes

我想知道是否可以将函数 属性 添加到所有本机对象原型(即 this MDN page 上的所有内容)。

例如,我可以将这个简单的函数设置为 Array.prototype,它会正常工作:

Array.prototype.tap = function (fn) {
  return fn(this);
};

[1, 2, 3, 4, 5].tap(console.log)

但是如果我想让这个函数在任何原型上执行怎么办?例如:

{ name: 'Jonathan', age: 19 }.tap(console.log); // { name: 'Jonathan', age: 19 }
new Map([['1 + 1', 2], ['2 + 2', 4]]).tap(console.log); // Map(2) {"1 + 1" => 2, "2 + 2" => 4}
'Hello World'.tap(console.log); // Hello World
true.tap(console.log); // true
new Date().tap(console.log); // Tue Oct 06 2020 21:09:33 GMT-0400 (Eastern Daylight Time)

是否有任何类型的“全局原型”可供我分配函数?还是我必须手动将其设置为每个原生原型?

你可以把它放在Object.prototype:

Object.prototype.tap = function (fn) {
  return fn(this);
};

[1, 2, 3, 4, 5].tap(console.log)
new Date().tap(console.log);

这将允许几乎任何对象访问该方法。唯一的例外是 Object.prototype 继承的对象(这种情况很少见,必须有意这样做):

Object.prototype.tap = function (fn) {
  return fn(this);
};

const obj = Object.create(null);
obj.tap(console.log);

但这只是出于好奇。请不要在实际代码中使用它。