问题描述:

  1. 创建对象有几种方法
  2. 原型,构造函数,对象实例,原型链
  3. instanceof原理
  4. new运算符,工作原理

创建对象的方法:

  1. var obj={name:'andy'} //字面量创建对象,默认原型指向Object,所以两个可以划分为一类
  2. var obj=new Object({name:'andy'})
  3. //Object({name:'andy'})
  1. //使用显式的构造函数创建对象
  2. var OBJ=function(){
  3. this.name="andy"
  4. }
  5. var o=new OBJ()
  6. //OBJ
  1. var P={name:'andt'}
  2. var obj=Object.create(P)
  3. OBJECT{}

原型,构造函数,实例,原型链:

image.png

  1. 实例:obj1,obj2,obj3
  2. 构造函数:new 后面的函数,即使没有this
  3. 原型链:通过prototye(构造函数)和proto(原型对象)层层向上寻找prototype,顶端是Object.prototype终止
  4. OBJ.proto==Function.prototype

instanceof:

实例对象._protoinstanceof 构造函数.prototype
image.png

new 运算符:

  1. 一个新的空对象被创建。继承自构造函数的原型对象
  1. var foo=function(){this.name="ang"}
  2. var f=new foo()//创建空对象f,继承自foo.prototype
  1. 构造函数foo被执行。执行的时候,相应的传参会被传入,同时上下文(this)会被指定为这个新实例
  2. 如果构造函数返回了一个”对象”,那么这个对象会取代整个new出来的结果,如果构造函数没有返回对象,则new出来的结果为步骤11创建的对象
  1. //模拟new过程
  2. var new2=function(func){
  3. //创建空对象,空对象关联构造函数的原型对象
  4. var o=Object.create(func.prototype)
  5. //执行构造函数
  6. var k=func.call(o)
  7. //判断构造函数的运行结果是不是对象类型
  8. if(typeof k == 'object'){
  9. return k
  10. }
  11. else{
  12. return o
  13. }
  14. }