**

原型编程范型的一些规则

**

Io语言中,最初只有一个根对象object,其他所有的对象都克隆自另外一个对象。如果A对象是从B对象克隆而来,那么B对
象就是A对象的原型。
JavaScriptIo语言都是使用原型模式来构造面向对象系统的语言。
我们拿动物世界的例子讲解Io语言。在Io中,根对象名为Object,通过克隆根对象Object,就可以得到另一个对象 Animal。
虽然Animal是以大写开头的,但是记住Io中没有类,Animal跟所有的数据一样都是对象。

Animal := Object clone // 克隆动物对象

现在通过克隆根对象Object获得了一个新的对象Animal,所以Object就被称为Animal的原型,目前Animal对象和它的原型对象一模一样,还没有任何属于他自己的方法和能力。我们假设在Io的世界里,所有的动物都会发出叫声,那么现在就给Animal对象添加 makeSound 方法吧。代码如下:

Animal makeSound := method( " animal makeSound " print );

现在所有的动物都能够发出叫声了,那么再来创建一个 Dog 对象。 显而易见, Animal 对象可以作为Dog 对象的原型, Dog 对象从 Animal 对象克隆而来:

Dog := Animal clone

可以确定,Dog 一定懂得怎么吃食物,所以接下来给 Dog 对象添加 eat 方法:

Dog eat := method( " dog eat  " print );

现在已经完成了整个动物世界的构建,通过一次次的克隆,Io对象世界里不再只有形单影只的根对象了(Object),而是多了两个新的对象: Animal对象 和 Dog 对象。 其中 Dog 的原型是 Animal , Animal的原型是 Object。 最后我们来测试 Animal和 Dog对象的功能。

先尝试调用Animal 的 makeSound 方法, 可以看到,动物顺利的发出了叫声:

Animal makeSound     // Animal makeSound

然后再调用Dog eat 方法,同样我们也看到了预期的效果:

Dog eat     // 输出 :  dog eat

Object 是 Animal 的原型,而 Animal是 Dog 的原型, 它们之间形成了一条 原型链 。 这个原型链是很有用处的,当我们尝试调用 Dog 对象的某个方法的时候,而它本身缺没有这个方法,那么 Dog 对象会把这个请求 委托 给他的原型 Animal 对象,如果 Animal 对象也没有这个属性,那么请求会顺着原型链继续被委托给 Animal 对象的原型 Object 对象, 这样一来便能得到继承的效果,看起来就像 Animal 是Dog 的 “ 父类 ”, Object 是 Animal 的 “ 父类 ”。

**总结一下: **
1.所有的数据都是对象
2.要得到一个对象,并不是通过实例化类,而是找个一个对象作为原型并克隆它。
3.对象会记住它的原型.
4.如果A对象是从B对象克隆而来的,那么B对象就是A对象的原型。
5.这个机制并不复杂,却非常强大,Io和 javaScript 一样, 基于原型链的委托机制就是原型继承的本质
6.原型编程中的一个重要特性: 当对象无法响应某个请求时,会把该请求委托给它自己的原型

Q.E.D.