扩展RegExp原型而不影响原始行为

时间:2016-12-30 19:22:59

标签: javascript regex object prototype

我正在创建一个扩展RegExp.prototype并使用assign:

的lib
function 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原型,而不是实例。

感谢。

1 个答案:

答案 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");