Get*_*ree 27 javascript constructor new-operator object-construction
请帮助我理解以下代码的工作原理:
<script>
var re = RegExp('\\ba\\b') ;
alert(re.test('a')) ;
alert(re.test('ab')) ;
</script>
Run Code Online (Sandbox Code Playgroud)
在第一行没有new运营商.
据我所知,JavaScript中的一个构造函数是一个初始化运算符创建的对象的函数,new它们并不意味着返回任何东西.
T.J*_*der 36
通常,如果某些内容被记录为构造函数,请使用new它.但在这种情况下,RegExp对于您将其称为函数的情况,具有已定义的"工厂"行为.请参阅ECMAScript(JavaScript)规范的第15.10.3节(链接到传出规范;新规范中的节号相同,您可以从ECMA 首页 [右侧]下载; I不想直接链接到~4MB PDF文件):
15.10.3 RegExp构造函数作为函数调用
15.10.3.1 RegExp(模式,标志)
如果pattern是一个对象R,其[[Class]]属性为"RegExp"且flags未定义,则返回R不变.否则调用RegExp构造函数(15.10.4.1),传递模式和flags参数并返回该构造函数构造的对象.
你可以实际定义你自己的JavaScript构造函数,以允许省略new关键字(通过检测它们被称为函数而转向并正确调用自己),但我不建议它,因为它会导致误导性代码.
bob*_*nce 10
+1 TJ Crowder拥有它.当调用普通函数时,ECMAScript标准不再为内置构造函数定义行为.通常它只是将自己称为构造函数,但是有一些更复杂的情况.
javascript [...]中的构造函数并不意味着返回任何内容
通常,构造函数可以忽略this并返回一个独立的对象:
function Thing() {
return {'foo': 1};
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您可以同样使用该函数作为构造函数(with new)或普通函数.
如果构造函数没有返回任何内容,就像构造函数的常用模式一样,new运算符本身也会确保它返回创建并传递的新对象this.在这种情况下,你必须使用new.
最好不要依赖于作为裸函数的构造函数,并且内置构造函数的替代行为很少有任何用处,所以通常你应该坚持使用new.
| 归档时间: |
|
| 查看次数: |
5642 次 |
| 最近记录: |