Javascript 设计模式——1.4 对象的易变性

来源:互联网 发布:有关大数据时代的论文 编辑:程序博客网 时间:2024/06/10 19:44

1.4 对象的易变性

在JavaScript中,一切都是对象(除了那三种原始数据类型。即便是这些类型,在必要的时候也会被自动包装为对象),而且所有对象都是易变的(mutable)。这意味着你能使用一些在大多数别的语言中不允许的技术,例如为函数添加属性:

 

这也意味着你可以对先前定义的类和实例化的对象进行修改:

  

在这个例子中,类的getGreeting方法是在已经创建了类的两个实例之后才添加的,但这两个实例仍然能获得这个方法,其原因在于prototype对象的工作机制。对象alice还得到了displayGreeting方法,而别的实例却没有。

与对象的易变性相关的还有内省(introspection)的概念。你可以在运行时检查对象所具有的属性和方法,还可以使用这种信息动态实例化类和执行其方法〔这种技术称为反射(reflection)〕,甚至不需要在开发时知道它们的名称。这些技术在动态脚本编程中发挥着重要作用,而静态语言(例如C++)则缺乏这样的特性。

本书中大多数用来模仿传统的面向对象特性的技术都依赖于对象的易变性和反射。如果你习惯使用C++或Java这类语言,可能会觉得这很奇怪,因为在那些语言中,不能对已经实例化的对象进行扩展,也不能对已经定义好的类进行修改。而在JavaScript中,任何东西都可以在运行时修改。这是一个强有力的工具,许多在别的语言中无法办到的事都能借助于它而办到。当然,这也有其不利之处。你可以定义一个具有一套方法的类,却不能肯定这些方法在以后总是完好如初。这是JavaScript中很少进行类型检查的原因之一。这个问题将在第2章讲述鸭式辨型(duck typing)和接口检查时进行探讨。

原创粉丝点击