new的过程发生了什么,手写实现new

new的过程

当使用 new 关键字调用函数时,该函数将被用作构造函数。new 将执行以下操作:

  1. 创建空对象:创建一个空的简单 JavaScript 对象。为方便起见,我们称之为 newInstance
  2. 绑定原型:如果构造函数的 prototype 属性是一个对象,则将 newInstance 的 [[Prototype]] 指向构造函数的 prototype 属性,否则 newInstance 将保持为一个普通对象,其 [[Prototype]] 为 Object.prototype

    备注: 因此,通过构造函数创建的所有实例都可以访问添加到构造函数 prototype 属性中的属性/对象。

  3. 绑定this并调用构造函数:使用给定参数执行构造函数,并将 newInstance 绑定为 this 的上下文(换句话说,在构造函数中的所有 this 引用都指向 newInstance)。
  4. 处理返回值:如果构造函数返回非原始值,则该返回值成为整个 new 表达式的结果。否则,如果构造函数未返回任何值或返回了一个原始值,则返回 newInstance。(通常构造函数不返回值,但可以选择返回值,以覆盖正常的对象创建过程。)

手写实现new

function Person(name,age){
	if(new.target){
		console.log('new',new.target)
	}
	this.name = name;
	this.age = age;	
}
Person.prototype.say = function(){
	console.log(this.name+' say hello');
}


let p1 = new Person('xiaoming',18);
console.log(p1)
let p1_1 = Person('xiaoming',18);
console.log(p1_1)


function myNew(contructor, ...args){
	//	1.创建一个新的空对象
	let obj = new Object();

	// 2.绑定原型:将新对象与构造函数的prototype对象关联
	obj.__proto__ = contructor.prototype;

	// 3.绑定this并调用:将构造函数的this指向新对象,执行构造函数
	let result = contructor.apply(obj,args);

	// 4.处理返回结果:如果返回值为引用类型,则返回该对象,否则返回创建的新对象
	return result instanceof Object ? result : obj;
}

let p2 = myNew(Person,'xiaoming',18);
console.log(p2)

你可能感兴趣的:(前端基础知识点,原型模式,javascript,开发语言)