JavaScript采用原型模式实现面向对象。原型的英文为Prototype,也意为雏形。雏形相比原型更好的说明了JavaScript的面向对象原理,因为雏形更能表明原始对象的不完整性。
原型模式在《设计模式》中有介绍,“明确一个实例作为要生成对象的原型,通过复制该实例来生成新的对象”。原型模式在静态语言(如C++)中的作用不太显著,但对于动态语言(如JavaScript)则是核心思想。通常在面向对象中,对象的原型就是类,从类生成对象是普遍的认同。但另一种观点认为,类不是必须的,对象不需要从类生成,而是复制已有的对象。JavaScript正是采用了这种思想。
需要新对象时,只需向对象添加属性。添加函数对象,就成为方法。如果属性不存在,则会查找prototype属性指定的对象。所以JavaScript是利用委派而不是继承实现面向对象。
function Tool() {
this.Use = function() { return "using..."; }
}
var tool = new Tool();
alert(tool.Use());
function Hammer() {}
Hammer.prototype = new Tool();
var hammer = new Hammer();
alert(hammer.Use());
在创建对象时,函数对象起到了构造器的作用。当调用new时完成以下操作:
- 生成对象
- 将原型的内部属性__proto__设置为原型的prototype属性,这里为Tool.prototype
- 调用函数,这里为Tool,参数为调用new时的参数
- 返回新对象