请教js如何模拟进程概念等相关问题

大东哥 发布于 2011/09/13 14:21
阅读 731
收藏 0

同一浏览器窗口内的js代码,如果模拟像进程那样的代码隔离?

如何做单例?

如何对某个函数禁止重定义?

是否可以用js手动起个新解析进程?

如何限定函数必须归于类中?也就是限定不能直接function xxx(){},必须XXX.prototype = {

xxx : function(){}

}

如何模拟const?

如何设计对代码的调用授权,也就是某些实例,类,函数得有权限才能调用?

还有很多问题。。。。。。

俺知道问得比较小白,大家不要被雷到,但目前做的东西,能实现这些,会很好办。

以下是问题补充:

@大东哥:js太强了,太动态了,想做些限制,怎么下手? (2011/09/13 14:40)
@大东哥:eval()是否是启一个新解析进程?能否用这个模拟隔离? (2011/09/13 15:21)
加载中
0
scl33
scl33

单例/隔离/禁止重定义: var sigleton = (function(){var privateObj = 10;var getObj=function(){return privateObj++;};return {get:getObj};})();//闭包非常强大

1. 返回的是{}, 即对象实例, 不可new.

2. 不可重定义, sigleton只是一个引用, 覆盖sigleton只是改变了引用的指向, 对于这个匿名函数, 你无法操作他, 他仍然存在, 也仍然没变, JS中本来就没有办法覆盖, 而都是改写引用重新指向, 也就是说JS的变量都不是指针.

3. privateObj你无法直接访问, 只能通过get方法访问, 这就是隔离, 不是和私有一样吗? 另外, 这里的privateObj就是一个const, 大家共用, 没办法直接改写.

4. JS中没有进程, 他是运行在浏览器进程中的线程, 你可以在JS中通过setTime或setInterval实现多线程效果.

5. JS这么灵活, 代码授权肯定可以做了, 只是贴出来会非常长, 需要建设的基础工具太多, 以前实现过类似的东西, 代码无法自行执行, 必须通过框架才能执行, 当然是在一些特定的场景中.

0
鉴客
鉴客

JS 身上承载了太多的期望,搞得 JS 现在可算是最复杂的编程语言之一了吧

大东哥
大东哥
确实,还感觉有些乱。
0
Genus
Genus
最近发现:js在许多方面都显得比较蹩脚(和java,python比较)。。。一些特性没有原生支持,让人很不爽。。
0
大东哥
大东哥

引用来自“杨辰”的答案

最近发现:js在许多方面都显得比较蹩脚(和java,python比较)。。。一些特性没有原生支持,让人很不爽。。
确实,想做些限制,想模拟些东西,又不知道解析器支不支持,纠结,哪里有完整的js规范的?
0
大东哥
大东哥

引用来自“scl33”的答案

单例/隔离/禁止重定义: var sigleton = (function(){var privateObj = 10;var getObj=function(){return privateObj++;};return {get:getObj};})();//闭包非常强大

1. 返回的是{}, 即对象实例, 不可new.

2. 不可重定义, sigleton只是一个引用, 覆盖sigleton只是改变了引用的指向, 对于这个匿名函数, 你无法操作他, 他仍然存在, 也仍然没变, JS中本来就没有办法覆盖, 而都是改写引用重新指向, 也就是说JS的变量都不是指针.

3. privateObj你无法直接访问, 只能通过get方法访问, 这就是隔离, 不是和私有一样吗? 另外, 这里的privateObj就是一个const, 大家共用, 没办法直接改写.

4. JS中没有进程, 他是运行在浏览器进程中的线程, 你可以在JS中通过setTime或setInterval实现多线程效果.

5. JS这么灵活, 代码授权肯定可以做了, 只是贴出来会非常长, 需要建设的基础工具太多, 以前实现过类似的东西, 代码无法自行执行, 必须通过框架才能执行, 当然是在一些特定的场景中.

非常感谢,但我还是有些问题:

1。单例/隔离/禁止重定义

   你举的例子:var singleton = ... 这个是能做到隔离,但是还是无法限制,如一些恶意代码这么修改:

singleton.get = function(){xxxxx};来重定义原有实现。限制这一点,对我现在的项目来说,非常重要。

没有const的支持,这个singleton就形同个摆设。不过关于const,有这样的语法:

const MAX_SIZE=10;但是IE6-9都不支持,firefox和其他几大浏览器都支持。(ie,你个BB的)。

4。关于进程的概念,这我还是知道的,我只是说有没有方法模拟,setTime或setInterval不能满足,这里说进程,主要是想说变量间的隔离,例如不同第三方代码定义的同名变量,不能影响,但是确又都跑在同一浏览器窗口中。倒是从闭包作用域链这里下手不知可不可行。

5。这个功能能解释一下大概思路吗?在浏览器中再跑一个js语法分析器?我目前很需要这个功能的思路。

 

0
Jason_hu
Jason_hu
语言就是一种工具,要使用在特定场合才更有效率。js在面向对象方面缺少存在不少问题,但是其已经成了浏览器的脚本标准,这就足够了。
0
scl33
scl33

关于5, 其实不像你想象的那样, 这里是一个用户自定义界面的模块, 用户通过拖放生成页面, 所见即所得, 用户也可以定义事件, 写一段JS响应事件. 最后, 用户的页面会组织到一起, 包括JS. 这里做了一些保护, 目的是让用户写的代码, 在组织页面时不会被立即执行, 即只有事件触发后, 才会执行, 以保护用户一些语法错误, 或有意无意的篡改或破坏代码, 影响了整个页面, 而导致整个页面加载就报错, 无法显示或不能正常运行.

基于这个目的, 而不是你说的完全防止篡改破坏等操作, 用户定义的方法片段会全部收集到一个JS对象中, 结构如{package1:{methods:{fun1:function(){},fun2:function(){}...}, scope:'public'}}, 收集之前使用try.catch尝试eval, 如果失败提示用户, 成功则将得到的方法引用, 组织起来并保存. 在页面运行加载的时候, 框架会将这些方法和定义的公用包, 根据定义的域, 重新组织到一个或多个闭包中, 使之相互可见或隔离.

关于你说的singleton.get = function(){xxxxx};进行篡改, 如果要做到完全防止客户端恶意替换, 那是不可能的. 但是, 值得注意的是, 无论你怎么改, 你只是改变了我暴露给你的那个对象, 而且, 我暴露给你的, 是拥有内部域的, 你在外部改的, 是无法拥有内部域的, 对于我内部的东西, 你怎么改也调用不了, 也看不见内部的方法代码, 他篡改了暴露的方法, 只是说这个客户端就没有任何地方暴露这个方法了, 也就没地方能调用了, 那么对于服务器, 重要数据, 或重要请求/参数而言, 更本没任何影响, 他要改, 那他就不能用了, 有什么关系呢, 让他改吧.

大东哥
大东哥
嗯,你说的我明白。 关于那个篡改严不严重的问题,看场景,在我这儿挺严重的,有个const,final支持多好。
返回顶部
顶部