【发布时间】:2013-12-12 13:23:22
【问题描述】:
我正在研究 Object.create 以创建自定义 RegExp 类。我想使用纯 JS 而不是 JQuery 或其他库。花时间研究了 MDN,here 和其他地方,我发现我的期望和理解仍然不足以完成我的任务。
到目前为止,我有这个:
( function ( SEAC ) {
var _NativeRegExp = RegExp,
_NativeRegExpProto = _NativeRegExp.prototype;
SEAC.RegExp = function ( ) { _NativeRegExp.apply( this, arguments ); };
SEAC.RegExp.prototype = Object.create( _NativeRegExpProto );
} )( self.SEAC || ( self.SEAC = {} ) );
如果我在下面的代码中使用它:
var re = new SEAC.RegExp( "[aeiou]+", 'g' );
var match = 'The quickening'.match( re );
我收到以下回复:
TypeError:方法 RegExp.prototype.toString 调用不兼容 接收者[对象对象]
我希望这个意图和问题足够清楚。
任何人都可以向我解释我做错了什么和/或建议如何做到这一点?或者也许我的方法不是最好的方法,建议另一种方法。我之前没有使用 Object.create,但我想看看这是否是处理继承和类创建的更好方法。
为什么要这么做,当然是想自定义类和一些原生方法。
【问题讨论】:
-
根据规范,您不能将
RegExp.prototype的方法应用于不是RegExp实例的对象:"如果this值不是对象或[[Class]]内部属性的值不是"RegExp"的对象。" es5.github.io/#x15.10.6 。所以我想不可能从RegExp继承。 -
Hmmm.... 太糟糕了,我想我将不得不回到我的自定义 RegExp 中的 RegExp 对象的实例,并让每个方法应用该对象方法然后返回它,可惜我必须把所有东西都包起来。
标签: javascript regex prototype prototypal-inheritance