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