要分清 构造器 与 原型对象 之间的关系
函数都可以作为构造器,每个函数都有与之对应的原型对象。
Object 构造器,Object.prototype 原型对象
Function Function.prototype
原生对象,内建对象,宿主对象
原生对象: ECMAScript 实现中,并非由宿主环境,而是完全由本规范定义其语义的对象。
Ps:标准的原生对象由本规范定义。一些原生对象是内置的,其他的可在 ECMAScript 程序执行过程中构建(如 arguments)。
内置对象:由 ECMAScript 实现提供,独立于宿主环境的对象,ECMAScript 程序开始执行时就存在。
Ps:标准的内置对象由本规范定义,ECMAScript 实现可以指定和定义其他的。所有内置对象是原生对象。一个内置构造器 (built-in constructor) 是个内置对象,也是个构造器。
宿主对象: 由宿主环境提供的对象,用于完善 ECMAScript 执行环境。
Ps:任何对象,不是原生对象就是宿主对象。
原生构造器的 [[prototype]] (内置属性) 都指向Function.prototype ;
除Object.prototype外的所有函数的(默认)原型对象的 [[prototype]] 都指向 Object.prototype ,Object.prototype 的 [[ prototype ]] 为 null ;
无论什么时候创建一个新函数,都会包含一个prototype属性,他指向函数的原型对象。默认情况下,所有原型对象都会自动获得一个constructor 属性,这个属性包含一个指向prototype所在函数的指针。
当调用构造函数创建一个新实例后,该实例的内部将包含一个指针(内部属性[[prototype]]),指向构造函数的原型对象。
Javascript 面向对象:
创建对象:
1.Object(),new Object()或用对象字面量 。
问题:用一个接口创建很多相似对象,会产生大量重复代码。
2.工厂模式
解决了(方法1)创建多的相似对象的问题。
问题:存在对象识别的问题。(内部还是都由Object构造器产生)
3.构造函数模式(自定义构造器)
可以将实例标识为一种特定的类型。
问题:想要在对象中共享的所有方法都要在每个实例被创建的时候重新创建一遍。
4.原型模式
把所有想共享的放在构造函数的原型对象中。
问题:因为所有属性和方法都被放在原型对象中共享,则会导致不同对象操作同一属性,结果违反本意的现象。
5. 组合模式
原文:http://www.cnblogs.com/Minda-blog/p/4868440.html