我想创建一个非开源的JavaScript应用程序,因此我希望学习如何模糊我的JS代码?这可能吗?
在阅读了彼得关于JavaScript的文章后,我注意到了
Brendan Eich表示,Harmony的目标之一是成为JavaScript编译器的更好目标.
目前有两个流行的编译器有一些模糊的ES:符合Harmony:
虽然CoffeeScript有一些合规性,但它并不是设计成ES:Harmony编译器,所以它对此没有用.
Tracuer似乎更严格地坚持ES:Harmony规范,但我不知道它是否打算成为一个完整的ES:Harmony编译器.
由于目标是将ES6编译为ES3,因此还需要支持ES5功能(并且可能需要支持将ES5编译为ES3或ES6至ES3).
我在Traceur邮件列表上留下了一个问题.
这种编译器的目的是向后兼容ES3.在ES3中没有完全模拟ES5和ES6.
之前有一些关于StackOverflow的问题,质疑如何通过作用域链访问局部变量,比如你想用括号表示法和字符串引用局部变量,你需要类似的东西__local__["varName"].到目前为止,我还没有找到实现这一目标的最骇客的方法,并且在数小时利用我知道的每一招之后都没有提出一种方法.
它的目的是在任意非实现变量上实现getter/setter.Object.defineProperties或__defineGet/Setter__要求调用上下文.对于全局或窗口上下文中的属性,您可以实现具有用于直接引用对象的setter/getter的目标.
Object.defineProperty(this, "glob", {get: function(){return "direct access"})
console.log(glob); //"direct access"
Run Code Online (Sandbox Code Playgroud)
即使在我与编译成一个改良的铬自定义扩展我之前的任何窗口创建,其内容具有实际全球范围内,甚至试图调用运行测试,this直接在全球范围内崩溃我的程序,我能拉这一关没有一个障碍:
Object.defineProperty(Object.prototype, "define", {
value: function(name, descriptor){
Object.defineProperty(this, name, descriptor);
}
};
define("REALLYglobal", {get: function(){ return "above window context"; }});
Run Code Online (Sandbox Code Playgroud)
然后,它可以在以后创建的所有帧中作为通过指定的getter/setter路由的全局帧.旧的__defineGet/Setter__也适用于该上下文而没有指定要调用它的内容(虽然在Firefox中不起作用,但上面的方法确实如此).
因此,基本上可以为对象上的任何变量定义get/set guard,包括直接调用对象的窗口/全局上下文(您不需要window.propname,只是propname).这是无法引用未填充的范围变量的问题,是唯一可以在可访问范围但没有可寻址容器的类型.当然,它们也是最常用的,所以它不是一个优势.这个问题也超越了ES6/Harmony中Proxies的当前实现,因为它是一个问题,特别是无法使用语言的语法来处理本地对象的容器.
我希望能够做到这一点的原因是,它是允许重载大多数数学运算符以用于复杂对象(如数组和散列)并导出复杂结果值的唯一障碍.如果在我为重载设置的对象类型上设置了值,我需要能够挂钩到setter.没有问题,如果对象可以是全局的,或者可以包含在父对象中,这可能就是我要用的东西.它仍然有用a.myObject,但目标是尽可能透明地使用它.
不仅如此,能够完成这样的事情真的很有用:
var point3d = function(){
var x, y, z;
return {
get: function(){ return [x, y, z]; },
set: function(vals){ x=vals[0]; y=vals[1]; z=vals[2]; }
};
};
Run Code Online (Sandbox Code Playgroud)
(这与ES6的解构类似,但具有更多通用应用程序,用于实现获取/设置所附带的功能,而不仅仅是传输复杂的值).即使这个基本代码也会完全失败:
var x …Run Code Online (Sandbox Code Playgroud)