重新认识面向对象
为了说明 JavaScript 是一门彻底的面向对象的语言,首先有必要从面向对象的概念着手 , 探讨一下面向对象中的几个概念:
一切事物皆对象
对象具有封装和继承特性
对象与对象之间使用消息通信,各自存在信息隐藏
实际上,JavaScript 语言是通过一种叫做原型(prototype)的方式来实现面向对象编程的。下面就来讨论基于类的(class-based)面向对象和基于原型的 (prototype-based) 面向对象这两种方式在构造客观世界的方式上的差别。
使用函数构造器构造对象
除了字面式声明(literal notation)方式之外,ECMAScript 允许通过构造器(constructor)创建对象。每个构造器实际上是一个函数(function) 对象, 该函数对象含有一个“prototype”属性用于实现基于原型的继承(prototype-based inheritance)和共享属性(shared properties)。对象可以由“new 关键字 + 构造器调用”的方式来创建
彻底理解原型链 (prototype chain)
在 ECMAScript 中,每个由构造器创建的对象拥有一个指向构造器 prototype 属性值的隐式引用(implicit reference),这个引用称之为原型(prototype)。进一步,每个原型可以拥有指向自己原型的隐式引用(即该原型的原型),如此下去,这就是所谓的原型链(prototype chain)在具体的语言实现中,每个对象都有一个__proto__ 属性来实现对原型的隐式引用
基于类的面向对象和基于原型的面向对象方式比较
在基于类的面向对象方式中,对象(object)依靠类(class)来产生。而在基于原型的面向对象方式中,对象(object)则是依靠构造器(constructor)利用原型(prototype)构造出来的。举个客观世界的例子来说明二种方式认知的差异。例如工厂造一辆车,一方面,工人必须参照一张工程图纸,设计规定这辆车应该如何制造。这里的工程图纸就好比是语言中的类 (class),而车就是按照这个类(class)制造出来的;另一方面,工人和机器 ( 相当于 constructor) 利用各种零部件如发动机,轮胎,方向盘 ( 相当于 prototype 的各个属性 ) 将汽车构造出来。
网友评论