在我的库中,我如何扩展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)
}
})