oli*_*ren 7 javascript regex resig prototype
我最近使用了John Resig的一个小实用程序库,名为inherit.js.我经常尝试理解我正在使用的库的核心部分,经过大量的讨论后我终于理解了代码的硬件(即他如何调用超类的相应方法).
我没有得到的1%位与正则表达式有关
fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/;
Run Code Online (Sandbox Code Playgroud)
test需要一个字符串作为参数.没有提到功能,但由于控制台没有错误,我想它必须飞,但它是如何工作的?xyz;.此功能无法执行,否则会导致" ReferenceError: xyz is not defined".对?那它是做什么的?fnTest等于_super在字边界上检查的正则表达式,或者在任何东西上匹配的正则表达式.双WTF; 又如何以及为什么.后来有一段相关的代码,正在使用这个正则表达式.
// Check if we're overwriting an existing function
prototype[name] = typeof prop[name] == "function" &&
typeof _super[name] == "function" && fnTest.test(prop[name])
? aFunctionThatCanCallSuper /* Lots of code */
: prop[name];
Run Code Online (Sandbox Code Playgroud)
我在这里想知道的是fnTest.test(prop[name]).我理解所有其他测试,检查属性是否存在,是一个函数等,但不是正则表达式测试的作用.任何人?
在什么:
test只接受字符串作为输入,因此将toString编辑一个函数,就像任何其他不是字符串的对象一样.xyz不被解释为变量,而是作为字符串,因此它不会抛出引用错误.这也发生在其他地方,例如:
var a = function(){}; var b = function(){};
console.log(a + b); // `+` coerces with `toString`
Run Code Online (Sandbox Code Playgroud)
的原因:
旧浏览器中的函数序列化是不可靠的,并且可能不会_super在函数体中输出属性,但是(我假设)类似于function{[native code]}或者[object Object]; 在这些情况下,使用正则表达式/.*/来匹配任何内容,而不是执行可以在输出正确结果的浏览器中完成的优化.
相关链接了解更多信息:
http://blog.buymeasoda.com/understanding-john-resigs-simple-javascript-i/(由Andreas发现)
http://es5.github.io/x15.3.html#x15.3.4.2
http: //bytes.com/topic/javascript/answers/747203-function-tostring
| 归档时间: |
|
| 查看次数: |
361 次 |
| 最近记录: |