欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 高考 > 「JavaScript深入」聊一聊 new操作符具体干了什么?

「JavaScript深入」聊一聊 new操作符具体干了什么?

2024/10/25 10:24:01 来源:https://blog.csdn.net/XH_jing/article/details/142598727  浏览:    关键词:「JavaScript深入」聊一聊 new操作符具体干了什么?

JavaScript深入 — new操作符

    • 概念
    • 流程
    • 手写new操作符


在这里插入图片描述

概念

在JavaScript中,new 操作符用于创建一个给定构造函数的实例对象

function Person(name, age){this.name = name;this.age = age;
}
Person.prototype.sayName = function () {console.log(this.name)
}
const person1 = new Person('Tom', 20)
console.log(person1)  // Person {name: "Tom", age: 20}
t.sayName() // 'Tom'

👆 可知:

  • new 通过构造函数 Person 创建出来的实例可以访问到构造函数中的属性
  • new 通过构造函数 Person 创建出来的实例可以访问到构造函数原型链中的属性(即实例与构造函数通过原型链连接了起来)

👇 构造函数中返回一个原始值,然而这个返回值并没有作用

function Test(name) {this.name = namereturn 1
}
const t = new Test('xxx')
console.log(t.name) // 'xxx'

👇 构造函数如果返回值为一个对象,那么这个返回值会被正常使用

function Test(name) {this.name = nameconsole.log(this) // Test { name: 'xxx' }return { age: 26 }
}
const t = new Test('xxx')
console.log(t) // { age: 26 }
console.log(t.name) // 'undefined'

流程

new 关键字的流程如下:

  • 创建一个新的对象 obj

    //创建一个新的空对象
    {}
    
  • 将对象与构造函数通过原型链连接起来

    //将新对象的[[prototype]]指向为Person.prototype
    {__proto__ = Person.prototype;
    }
    
  • 将构造函数中的this绑定到新建的对象 obj

    //将Person构造函数的this设置为新创建的对象,执行
    {__proto__ = Person.prototype;name = 'Tom';age = 20;
    }
    
  • 根据构造函数的返回类型作判断,如果是原始值则被忽略,如果返回对象,需要正常处理

    //构造函数Person没有return对象的话,将该新创建的对象返回
    const person = {...}
    

👻 具体流程图如下:

在这里插入图片描述


手写new操作符

function myNew(Func, ...args) {//创建一个新对象const obj = {};//新对象原型指向构造函数原型对象Object.setPrototypeOf(obj, Func.prototype);//将构建函数的this指向新对象const result = Func.apply(obj, args);//根据返回值判断return result !== undefined ? result : obj;
}

👇 测试代码

function Person(name, age) {this.name = name;this.age = age;
}
Person.prototype.say = function () {console.log(this.name);
};let p = myNew(Person, "huihui", 123);
console.log(p); // Person {name: "simon", age: 123}
p.say(); // simon

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com