原型扩展



在我的库中,我如何扩展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,但该属性不可写!(即使是这样,这也意味着过去创建的任何对象都不会有新功能,只有新对象才会有,而且你会破坏所有类型的默认功能,因为原型中的所有默认方法都是不可枚举的,甚至不能复制…)

你没有发现这个问题的原因是你没有启用严格模式。我建议始终使用严格模式,以捕获这样的错误。

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

TypeError:不能赋值给函数的只读属性'prototype' '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)
}
})

最新更新