--- title: Rhino overview slug: Mozilla/Projects/Rhino/Overview translation_of: Mozilla/Projects/Rhino/Overview ---

简介

大多数用过 JavaScript 的人都是将js脚本放入HTML页面中使用。然而, Rhino 仅仅是对javascript核心部分的实现,并没有包含操作HTML的对象或方法。

Rhino 包括

语言

JavaScript 的标准是 Standard ECMA-262 ECMAScript: A general purpose, cross-platform programming language. Rhino 1.3 及以上版本遵照上述标准的第3版。

Rhino 1.6 及以上版本实现了 ECMA-357 ECMAScript for XML (E4X) 标准. 查看详细的规格说明可以获得更多的信息,查看 Rhino version 1.6R1 release notes 可以看到Rhino对标准实现的具体情况。

此外,Rhino实现了JavaAdapters,这样我们可以用一个JavaScript对象来实现任何java的接口或者继承任何java的类。查看下载文件中example文件夹中的enum.js获取更多的信息。.

有很多JavaScript的书和教程。 我们推荐JavaScript: The Definitive Guide 这本书,里面有一章是说Rhino的。

废弃的语言特性

很多在JavaScript 1.2中定义的特性已经被废弃了. 这些特性允许“计算反射”:可以决定和影响它被评价方法等方面的能力。 这些特性没有被广泛使用,他们对阻碍和防止优化的行为强加了重要的约束。 这些被废弃的特性是 __proto__ 和 __parent__ 属性, 还有构造函数 With,、ClosureCall。在JavaScript 1.4中使用这些特性会产生错误。在其他的版本中使用这些特性,会产生警告。

国际化

The messages reported by the JavaScript engine are by default retrieved from the property file org/mozilla/javascript/resources/Messages.properties. If other properties files with extensions corresponding to the current locale exist, they will be used instead.

JavaScript语言版本

JavaScript引擎的很多行为与语言的版本有关。在浏览器调用中,JavaScript版本的选择是通过script标签中的LANGUAGE属性定义的,比如"JavaScript1.2"。

1.3 和更高版本是ECMA一致的。

操作符 ==  和 !=

1.2版本用 == 和 != 来处理绝对相等的问题。 在1.3或更高的版本里, == 和 != 和ECMA中所描述的一样。 操作符 === and !== 在所有版本中都表示绝对相等。

布尔转换

1.3之前的所有版本Boolean(new Boolean(false)) 值为false 。在1.3及1.3之后,它的值为true。

Array.prototype.toString 和 Object.prototype.toString

1.2版本只是返回数组或对象的文字符号 (比如"{{ mediawiki.external(1,2,3) }}" or "{a:1, b:2}" )。 在1.3或更高版本中这些函数与ECMA标准一致。

Array 构造函数

只有在1.2版本中,Array(i) 用一个参数i构造一个只有一个元素且元素的值为i的数组。 在其他版本中,使用和ECMA一致的标准 (一个没有元素的数组被构造,长度为i)。

String.prototype.substring

只有在1.2版本中, 如果第一个参数小于第二个参数,两个参数不会互换。其他的版本都符合ECMA标准。

String.prototype.split

只有对1.2版本,split按照Perl4的特例当用一个单独的空格字符作参数时, (跳过最先的空白,用空白分割). 其他的版本完全按照ECMA的标准分割。

安全

Rhino的安全特性提供了找到代码片段的来源的功能 (还有任何会轮流产生的代码片段)。这些特性考虑到了传统的基于URL的安全策略(在网景领航员中的JavaScript)的实现。执行信任的JavaScript代码时可以不考虑安全性特征。

运行不被信任的JavaScript代码时,需要做两件事来保证安全性。第一,每一个被创建的Context必须被提供一个实现SecuritySupport接口的实例。 这样在功能上给Rhino提供了让它执行安全相关任务的支持。

第二, security.requireSecurityDomain属性的值应该被改为true在资源束bundle org.mozilla.javascript.resources.Security中. 这个属性的值可以在运行时通过调用ContextisSecurityDomainRequired方法来决定。将这个属性设置为ture,要求任何编译或评估JavaScript的调用必须提供一个安全区域对象(任意类型),用来标识JavaScript代码。在一个典型的客户端嵌入中,这个对象可能是提供javascript的服务器的URL,或者是一个包含代码片段的签发人的代表(用于基于证书的安全策略)。

当JavaScript代码想要执行一个受限制的行为时,安全区域会被后面的方法检索。类上下文会从安全管理(java.lang.SecurityManager.getClassContext())中得到。执行限制行为的代码对应的类 可以通过寻找一个在类上下文中合适的位置得到。如果调用者是JavaScript,得到的类可能是一种或两种类型。首先,它可能是解释器(如果解释器模式有效)。第二,它有可能是一个生成的类,如果类文件生成支持。一个植入可以区分两种情况,通过调用在Context Class中调用isInterpreterClass()。 如果是解释器类,调用Context的getInterpreterSecurityDomain() 方法来获取当前正在执行的被解释的脚本或方法的安全区域。否则,就是一个生成的类,一个嵌入可以调用在实现SecuritySupport的类中调用getSecurityDomain()。当类被定义而且被打开,恰当的安全区域和它建立关联,而且可以通过调用这个方法找回。一旦安全区域被决定,一个植入可以执行任何检查者适合去决定是否允许去做的操作。

{{ languages( { "ja": "ja/Rhino_Overview" } ) }}