es5 Object.create、new、继承

383 阅读1分钟

Object.create(obj)可以这样实现

(1)

Object._create=function(obj){
    let o={}
    Object.setPrototypeOf(o,obj)
    return o;
}

(2)

Object._create=function(obj){
    var F=function (){}
    F.prototype=obj
    return new F();
}

new命令简化的内部流程,可以用下面的代码表示

function _new(){
  //将 arguments 对象转为数组
  var args = [].slice.call(arguments);
  //取出构造函数
  var constructor = args.shift();
  //创建一个空对象,作为将要返回的对象实例
  let _this={}
  //将这个空对象的原型,指向构造函数的prototype属性
  Object.setPrototypeOf(_this,constructor.prototype);
  //或者var _this = Object.create(constructor.prototype);
  //将这个空对象赋值给函数内部的this关键字,开始执行构造函数内部的代码
  var result = constructor.apply(_this, args);
  // 如果返回结果是对象,就直接返回,否则返回_this对象
  return (typeof result === 'object' && result != null) ? result : _this;
}

es5函数的继承

//父构造函数
function Super(props){
    this.a=props.a
}
Super.prototype.aa='11'
//子构造函数
function Sub(props){
    //实例属性、方法的继承
    Super.call(this);
    this.b= props.b
}
//原型对象的继承
Object.setPrototypeOf(Sub.prototype,Super.prototype)
/*
或者:
Sub.prototype = Object.create(Super.prototype)
Sub.prototype.constructor = Sub
或者:
let F= function(){}
F.prototype = Super.prototype
Sub.prototype = new F()
Sub.prototype.constructor = Sub
/*
//静态属性、方法的继承
Object.setPrototypeOf(Sub,Super)
Sub.prototype.bb='22'
//更正constructor属性
Sub.prototype.constructor=Super