原型扩展

Prototype extension

在我的库中,如何扩展 Object 的原型以便库的用户能够使用该扩展?

例如,在我的图书馆里我做 Object.prototype.greet = () => console.log("Hello")。我怎样才能使库的最终用户使用该方法,就像 ({}).greet()?

您扩展 Object.prototype 不正确。实际上,在你的问题中你做对了,但在你在评论中链接的实际代码中你做错了。

您当前的代码是这样的:

Object.prototype = {
    ...Object.prototype,
    forEach: function(block) {
        return forEachEntryOf(this, block)
    },
    map: function(block) {
        return mapEachEntryOf(this, block)
    },
    filter: function(block) {
        return filterEachEntryOf(this, block)
    }
}

这行不通,因为您试图替换 Object.prototype 但 属性 不可写! (即使是,这也意味着过去创建的任何对象都不会具有新功能,只有新对象会有,另外你会破坏各种默认功能,因为原型中的所有默认方法都是 non-enumerable 甚至不会被复制...)

你之所以不认识这个问题是因为你没有开启严格模式。 我建议始终使用严格模式,以捕获此类错误。

启用严格模式(在文件顶部添加 'use strict'),您会收到此错误:

TypeError: Cannot assign to read only property 'prototype' of function 'function Object() { [native code] }'

因此,解决方案是分配各个属性或使用 Object.assign:

Object.prototype.forEach = function (block) {
  return forEachEntryOf(this, block)
}

Object.prototype.map = function (block) {
  return mapEachEntryOf(this, block)
}

Object.prototype.filter = function (block) {
  return filterEachEntryOf(this, block)
}

...或...

Object.assign(Object.prototype, {
  forEach: function(block) {
    return forEachEntryOf(this, block)
  },
  map: function(block) {
    return mapEachEntryOf(this, block)
  },
  filter: function(block) {
    return filterEachEntryOf(this, block)
  }
})