js实现new以及继承
继承实现
function A(aaa) {
this.aa = [...arguments][0] //属性的初始化
this.aaa = aaa
}
A.prototype.bb = function(first_argument) {
this.bb = 2 //方法添加在原型上
};
console.log(A.prototype)
let zz = new A(56)
console.log(zz.__proto__)
console.log(zz)
function AA(aaa,bbb) { //让AA 继承A
let obj = new A(aaa)
Object.keys(obj).map(item=>{ //继承父级属性
this[item] = obj[item]
})
this.bbb = bbb // AA私有属性 AA私有方法可以添加在AA原型上
}
AA.prototype.__proto__ = A.prototype // 最关键一步 让AA的原型链指向A的原型
//原型链顺序 AA=>A=>Function=>Object=>null 实现继承的关键就是原型链的访问顺序 当访问一个熟悉的时候会顺着原型链一直查找
let zzz = new AA(568,8)
zzz.bb()
console.log(zzz) // 打印可以看到zzz并未有bb方法 bb方法是顺着原型链访问的A的
new实现
function A(aaa) {
this.aa = [...arguments][0] //属性的初始化
this.aaa = aaa
}
A.prototype.bb = function(first_argument) {
this.bb = 2 //方法添加在原型上
};
console.log(A.prototype)
let zz = new A(56)
console.log(zz.__proto__)
console.log(zz)
function MyNew(fun){ //只能实现传入构造函数实现mynew
const obj = {} //生成一个新的对象
const args = [...arguments] //因为arguments不是一个真正的数组 所以需要转化成数组 可以用...是因为它有 iterator接口
args.shift()
fun.apply(obj,args) //new生成实例的时候执行了一遍构造函数 所以这里也要执行 并且改变this的指向
obj.__proto__ = fun.prototype //这一步是为了获取构造函数 以及原型 真正实现他是A的一个实例
return obj
}
let zzz = MyNew(A,555)
zzz.bb()
console.log(zzz)
console.log(A.prototype)
console.log(typeof zzz)
console.log(zzz instanceof A)
// new 运算符的过程就是创建一个对象 执行构造函数 并且继承构造函数的的原型