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