本文转自:http://remember2015.info/blog/?p=141#scope-chain

 

零、索引

  1. 对象(An Object)
  2. 原型链(A Prototype Chain)
  3. 构造函数(Constructor)
  4. 执行上下文栈(Execution Context Stack)
  5. 执行上下文(Execution Context)
  6. 变量对象(Variable Object)
  7. 激活对象(Activation Object)
  8. 作用域链(Scope Chain)
  9. 闭包(Closures)
  10. this指针(This Value)
  11. 总结(Conclusion)

本文是对“ECMA-262-3 in detail”系列学习内容的概述与总结。如果你对ES3系列文章感兴趣,本文每一节内容均包含相应ES3系列章节的链接,以供阅读与获取更深入的解释。

本文预期读者:有经验的程序员,专业人士

让我们首先来考虑ECMAScript的基础—— 对象(object) 的概念。

一、对象(An Object)

ECMAScript是一门高度抽象的面向对象(object-oriented)语言。虽然ECMAScript包含 基本类型(primitives) , 但是在需要的时候它们都会被转换为对象.

对象是一个属性的集合(collection of properties),同时具有单一原型对象引用(single prototype object)。原型可以指向一个对象,也可以为 null

让我们来看一个基本的对象Foo。首先要说明的是:一个对象的原型会使用内部属性[[Prototype]]表示引用。在下图中我们将使用 “__<内部属性>__”来标记内部属性,比如以__proto__ 来表示原型属性(这是某些脚本引擎比如SpiderMonkey的对于原型概念的具体实现,尽管并非标准).

代码如下:

1 var foo = {
2     x: 10,
3     y: 20
4 };

foo对象含有两个明确的私有属性(x与y)和一个隐含的 __proto__ 属性(指向foo的原型):

[译] JavaScript核心指南(JavaScript Core)  【转】

图 1. 一个含有原型的基本对象

为什么需要原型呢,让我们考虑 原型链 的概念来回答这个问题.

二、原型链(A Prototype Chain)

原型对象也只是简单的对象,并可能有自己的原型。如果一个原型有一个非空引用指向它自己的原型,它自己的原型也有非空引用指向自己的原型……诸如此类,这就是所谓的 原型链

原型链是由 有限(finite) 的对象链接而成,可以 实现 继承(inheritance) 与 共享 属性.

考虑下面这样一种情况:假设我们有两个差别很小的对象,那么在一个设计良好的系统中,显而易见地,我们将会 复用(reuse) 那些相似的功能/代码而不是在每个对象中重复实现。在基于类的系统中,这个 代码重用(code reuse) 风格称为基类继承(class-based inheritance— 你在A类中放入公共的功能(共性),提供给继承于A类的B和C类,同时B和C类保持自身的微小差别。

ECMAScript没有类的概念。但是代码复用的理念类似 (甚至在某些方面比基于类的语言更加灵活) 并通过原型链实现。这种类型的继承被称为 基于原型的继承(prototype based inheritance)。

类似于类”A”,”B”,”C”,在ECMAScript中尼创建对象类”a”,”b”,”c”,相应地, 对象“a” 拥有对象“b”和”c”的共同部分。同时对象“b”和”c”只包含它们自己的附加属性或方法。

01 var a = {
02     x: 10,
03     calculate: function (z) {
04         return this.x + this.y + z
05     }
06 };
07  
08 var b = {
09     y: 20,
10     __proto__: a
11 };
12  
13 var c = {
14     y: 30,
15     __proto__: a
16 };
17  
18 // 调用继承的方法
19  
20 b.calculate(30); // 60
21  
22 c.calculate(40); // 80

相关文章:

  • 2022-01-12
  • 2022-12-23
  • 2021-12-28
  • 2022-12-23
  • 2022-12-23
  • 2021-12-09
  • 2018-11-28
猜你喜欢
  • 2021-06-26
  • 2022-01-23
  • 2018-01-31
  • 2021-10-10
  • 2021-10-28
  • 2021-06-24
相关资源
相似解决方案