概述:创建对象有几种方法 原型、构造函数、实例、原型链 instanceof 的原理 new 运算符
创建对象有几种方法:
var o1 = { name: 'o1' }//对象字面量
var o11 = new Object({ name: 'o11' })
var M = function () { this.name = 'o2' }//显示构建函数创建对象
var o2 = new M()
var P = { name: 'o3' }//使用现有的对象来提供新创建的对象的__proto__
var o3 = Object.create(P)
原型、构造函数、实例、原型链
构造函数和原型对象的关系:可以通过 new 运算符生成一个实例,任何函数都可以成为构造函数,声明一个函数时,自带 prototype 属性,该属性初始化一个空对象(原型对象)。
实例和原型对象的关系:实例的__proto__ 引用构造函数的prototype对象
原型链:从实例对象向上找与构建该实例相关联的对象,关联对象亦有创建它的对象,逐级向上找,直到Object.prototype 至此链到达顶端。
注意:1、只有函数有prototype,对象没有 2、只有实例对象有 __proto__
instanceof 原理:判断实例对象的 __proto__ 属性和构造函数的 prototype 是否是同一个地址引用
new 运算符:new 运算符后跟的是一个构造函数
new运算符原理/步骤:
1、一个新的对象被创建。它继承自构造函数的原型对象 prototype
2、构造函数被执行。执行的时候,相应的传参会被传入,同时上下文(this)会被指定为这个新实例。当没有任何参数的情况下,new foo 等同于 new foo()
3、如果构造函数返回了一个“对象”,那么这个对象会取代整个 new 出来的结果。如果构造函数没有返回对象,那么 new出来的结果为步骤1创建的对象。