js实现new以及继承
发布于 4 年前 作者 zhsonga 4237 次浏览 来自 分享

继承实现

	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 运算符的过程就是创建一个对象  执行构造函数   并且继承构造函数的的原型

iterator接口

回到顶部