new操作符具体做了什么

new操作符具体做了什么

1. 会创建一个新对象   :  返回对象

2. 原型赋值

3. 改变this指向

4. 判断构造函数最后返回的是什么类型

(如果是基本类型则无视,如果是引用类型则返回该对象,new不起作用了)

 

例子:

function Fun(){

    Console.log(this) =指向window

    this.name = '张三';

}

 

var obj = new Fun();

 

console.log( obj );Fun {name: '张三'}  对应第一点[会创建一个新对象]; 对应第三点,[改变this指向]

 

console.log( obj.__proto__ );

console.log( Fun.prototype );

 

console.log( obj.__proto__ ===Fun.prototype  ); true 对应第二点[原型赋值]

 

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

 

function Fun(){

    this.name = '张三';

    return {a:1}   对应第四点:如果是引用类型则返回该对象,new不起作用了

    return [1,2,3]  对应第四点:如果是引用类型则返回该对象,new不起作用了

    return 111对应第四点:如果是基本类型则无视

}

 

var obj = new Fun();

console.log( obj );  {a:1}  [1,2,3]  Fun {name: '张三'}

 

console.log( obj.__proto__ ); constructor: ƒ Object()

console.log( Fun.prototype ); constructor: ƒ Fun()

 

console.log( obj.__proto__ ===Fun.prototype  ); false  true

 

 

New原理:

function Foo( name, age ){

    this.name = name;

    this.age = age;

    return [1,2,3]

}

 

 

function crated( fn ,...arg){
 

    //1. 创建对象

    var obj = {}; //Object.create({})

 

    //2. 原型赋值==> 把fn 的原型赋值给obj

    Object.setPrototypeOf( obj,fn.prototype );

 

    //3. 改变this指向

    var result = fn.apply( obj , arg );

 

    //4. 判断构造函数最后返回的是什么类型

    return result instanceof Object ? result : obj;

 

}

console.log(  crated( Foo ,'张三',18)   );

 

posted @ 2022-05-11 15:17  杨建鑫  阅读(168)  评论(0)    收藏  举报