我正在创建一个扩展RegExp.prototype并使用assign:
的libfunction VerExp() {
return Object.assign(RegExp.prototype, {
// my methods here
});
}
但是当我尝试使用编译函数时,这会导致一种奇怪的行为:
const regexp = new VerExp();
// some stuffs....
regexp.compile();
错误:
TypeError: Method RegExp.prototype.compile called on incompatible receiver [object Object]
但是,如果我创建一个新实例,扩展它并返回,将起作用:
function VerExp() {
const regexp = new RegExp();
return Object.assign(regexp, {
// my methods here
});
}
const regexp = new VerExp();
regexp.compile();
我想了解更多错误,为什么会发生这种情况,我怎样才能使它扩展RegExp原型,而不是实例。
感谢。
答案 0 :(得分:1)
那是因为Object.assign
返回属性分配给的同一个对象。
Object.assign(RegExp.prototype, {
// my methods here
});
将始终返回RegExp.prototype
,因此您的功能没有多大意义。所有调用将一次又一次地重新分配相同的属性,并返回相同的对象。
由于RegExp.prototype
不是正则表达式对象,因此尝试在其上调用正则表达式方法将会抛出。
RegExp原型对象是一个普通对象。它不是RegExp 实例并没有[[RegExpMatcher]]内部插槽或任何 RegExp实例对象的其他内部插槽。
你可能想要的是子类RegExp
:
class VerExp extends RegExp {
// my methods here
}
const regexp = new VerExp();
regexp.compile();
console.log("No error");