May 25, 2007

ECMA-262试译:4.2.1 Objects

4.2.1 对象

ECMAScript 并没有严格意义上的类,在这一点上不同于 C++、Smalltalk 或者 Java,不过作为替代,它支持构造函数(constructors),利用它,可通过执行代码创建对象:给对象分配 存储,然后通过赋初始值来初始化对象属性的全部或部分。所有的构造函数都是对象,但并非所有的对象都是构造函数。每个构造函数都有一个 Prototype(原 型)属性,被用于实现基于原型继承(prototype-based inheritance)共 享属性(shared properties)。使用构造函数来创建对象要用到 new(新 建)表达句;举个例子,new String("A String") 创建了一个新的字符串对象。不使用 new 调用构造函数的后果取决于这个构造函数本身。举个例子,String("A String") 产生一个原语字符串而非对象。

ECMAScript 支持基于原型继承。每一个构造函数都有一个相关联的原型,它创建的所有 对象都拥有一个隐含的引用指向那个与其构造函数相关联的原型(所谓的对象的原型)。更深一步讲,原型还可能会拥有 到它的原型的隐含的非空引用,依此类推;这被称为原型链(prototypechain)。当引用被作为对象中的属性 时,在原型链中第一个包含以这个引用的属性名为名的属性的对象,它的那个属性就是被引用者。换句话说,首先检查被直接提及的对象是否包含某个属性;如果那 个对象包含同名属性,被引用指向的就是这个属性;如果那个对象并没有包含同名属性,接下来检查它的原型,如此继续下去。

通常,在基于类的面向对象语言中,实例装载状态,类装载方法,且继承的仅仅是结构和行为。而在 ECMAScript 中,状态和方法均由对象装载,且结构、行为、状态都会被继承。

所有没有直接包含某个它们的原型所包含的特定属性的对象,与它们的原型共享那个属性和它的值。下面的图表阐述了一切:

CF 是一个构造函数(当然也是一个对象)。使用 new 表达式,我们创建了五个对象:cf1,cf2,cf3,cf4 和 cf5。这些对象中的每一个都包含了名为 q1 和 q2 的属性。虚线表示隐含的原型关系;比方说,cf3 的原型是 CFp。构造函数 CF自己拥有两个属性,名为 P1 和 P2,它们对于 CFp,cf1,cf2,cf3,cf4 或 cf5 而言都是不可见的。CFp 中名为 CFP1 的属性被 cf1,cf2,cf3,cf4 和 cf5 (除了 CF)共享,这样,CFp 的隐含原型链中的所有属性没有名为 q1,q2 或 CFP1 的。需要注意的是,CF 和 CFp 之间没有隐含的原型关联。

不同于基于类的面向对象语言,ECMAScript 中的属性可以通过给它们赋值的方式,把它们动态添加给对象。也就是说,构造函数不需要给所构造的对象的部分或全部属性命名或赋值。在上面的图表中,通过给 CFp 中的属性赋新值就可以给 cf1,cf2,cf3,cf4 和 cf5 添加新的共享属性。


//觉得这篇是我到目前为止翻的最好的 :)

1 comment:

氷の鋭 said...

格式变更:下标使用small标签,粗体用span,粗斜体用b。
4.2.1节第二段"当引用被作为对象中的属性 时,在原型链中第一个包含以这个引用的属性名为名的属性的对象,它的那个属性就是被引用者。"
现译为:"若为某对象中的一个属性建立引用,那么此引用指向该对象的原型链中,最先拥有同名属性的对象所包含的这个属性。"

//那个when好像确实只能这么翻,我英文看来还是够戗
//4.3节译好了,但文件一大堆,而且简单,不发了。