美文网首页想法读书
js中new操作符做了什么并实现自己的new操作符

js中new操作符做了什么并实现自己的new操作符

作者: 绿芽 | 来源:发表于2022-07-14 17:56 被阅读0次

我们通过new运算符的使用,来探寻new操作符在执行的过程中究竟做了哪些操作,并且根据操作实现自己的new运算符。

定义

new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。

使用

先看正常使用new运算符调用构造函数

function Test(testText) {
    this.testText = testText;
}
Test.prototype.console = function() {
    console.log(this.testText);
}
let t1 = new Test('文本文本');

console.log(t1.testText); // 文本文本
t1.console(); // 文本文本

上述代码使用new运算符调用构造函数,会返回t1这个值,然后t1可以访问构造函数内部this上的值(也就是说他们两个绑定在了一起),t1还可以访问构造函数原型链上的值。下面不使用new操作符调用构造函数来进行对比:

1、对比构造函数返回的值

使用new运算符返回的t1值为对象

function Test(testText) {
    this.testText = testText;
}
Test.prototype.console = function() {
    console.log(this.testText);
}
let t1 = new Test('文本文本');
console.log(Object.prototype.toString.call(t1)); // [object Object]

console.log(t1.testText); // 文本文本
t1.console(); // 文本文本

不使用new运算符返回值为undefined,并且函数内部的值不可访问。

function Test(testText) {
    this.testText = testText;
}
Test.prototype.console = function() {
    console.log(this.testText);
}
let t1 = Test('文本文本');
console.log(Object.prototype.toString.call(t1)); // [object Undefined]

console.log(t1.testText); // 报错
t1.console(); // 报错

由上述对比可知构造函数内部不返回值,new操作符会创建一个对象,并将函数内部的this绑定在这个对象上并将它返回。

2、构造函数内部有返回值时的对比

构造函数返回普通类型值时的结果对new运算符返回结果没有任何影响。如:

function Test(testText) {
    this.testText = testText;
    // return 1;
    return '2222';
}
Test.prototype.console = function() {
    console.log(this.testText);
}
let t1 = new Test('文本文本');
console.log(Object.prototype.toString.call(t1)); // [object Object]

console.log(t1.testText); // 文本文本
t1.console(); // 文本文本

构造函数返回引用类型值时,会覆盖new运算符调用时返回的结果。如:

function Test(testText) {
    this.testText = testText;
    return {};
    // return function() {};
    // return [];
}
Test.prototype.console = function() {
    console.log(this.testText);
}
let t1 = new Test('文本文本');
console.log(Object.prototype.toString.call(t1)); // [object Object]
// console.log(Object.prototype.toString.call(t1)); // [object Function]
// console.log(Object.prototype.toString.call(t1)); // [object Array]

console.log(t1.testText); // undefined
t1.console(); // 报错

当构造函数返回值为null时,对new运算符调用返回结果无影响。如:

function Test(testText) {
    this.testText = testText;
    return null;
}
Test.prototype.console = function() {
    console.log(this.testText);
}
let t1 = new Test('文本文本');
console.log(Object.prototype.toString.call(t1)); // [object Object]

console.log(t1.testText); // 文本文本
t1.console(); // 文本文本

通过构造函数内部有返回值时的对比,会发现当构造函数返回结果为普通类型和null时对new运算符调用返回的结果没影响,而当构造函数内部返回的是引用类型时,则会覆盖new运算符调用返回的结果。

总结

综上所述可以发现new运算符一共做了以下几件事:
1、 创建一个对象
2、 new创建的对象指向了构造函数的原型对象
3、 构造函数内部的this指向了new创建的对象
4、 调用了构造函数
5、 如果构造函数内部的返回值为普通类型和null则将new创建的对象返回出去,而如果构造函数返回的对象为引用类型对象则采用构造函数返回的对象。

实现自己的new运算符

function myNew(Fn, ...paramet) {
    // 创建一个对象并可以访问构造函数Fn的原型
    let obj = Object.create(Fn.prototype);
    // 将构造函数内部this绑定到创建的对象上,并调用构造函数
    let fnReasult = Fn.apply(obj, paramet);
    // 判断需要返回的结果
    return fnReasult instanceof Object? fnReasult: obj;
}

测试

function Test(testText) {
    this.testText = testText;
    return null;
}
Test.prototype.console = function() {
    console.log(this.testText);
}
// let t1 = new Test('文本文本');
let t1 = myNew(Test, '文本文本');
console.log(Object.prototype.toString.call(t1)); // [object Object]

console.log(t1.testText); // 文本文本
t1.console(); // 文本文本

相关文章

  • js中new操作符做了什么并实现自己的new操作符

    我们通过new运算符的使用,来探寻new操作符在执行的过程中究竟做了哪些操作,并且根据操作实现自己的new运算符。...

  • new操作符

    最近在掘金上看到大佬 yck 的文章 重学 JS 系列:聊聊 new 操作符把new操作符的作用,如何自己实现ne...

  • new操作步骤

    js中的new()到底做了些什么?? 要创建 Person 的新实例,必须使用 new 操作符。以这种方式调用构造...

  • 关于 new 操作符

    1. 为什么要有new操作符? JS 的 new 到底是干什么的? 本文指出,new 操作符其实就是个语法糖,用了...

  • new

    什么是new操作符 new会生成一个实例对象,该对象的this指向该实例 实现一个new操作符

  • JS基础回归01:new操作符,原型和原型链

    本篇介绍 new 操作符的背后原理以及 JS 如何依赖原型形成原型链,完成继承。 new 操作符的本质 new 操...

  • new 对象 class

    new 操作符具体干了什么? 当我们new一个数据的时候,new操作符到底做了什么? 首先是创建实例对象{},th...

  • JavaScript手写代码无敌秘籍

    1实现一个new操作符 new操作符做了以下事情: 1、创建了一个全新的对象2、会被执行[[Prototype]]...

  • JS手动实现一个new操作

    要手动实现一个 new 操作符,首先要知道 new 操作符都做了什么事,即构造函数的内部原理:1.创建一个新对象;...

  • new操作符原理及实现

    [toc] 分析:new做了什么 new操作符通过执行自定义构造函数或者js内置构造函数,从而生成一个实例对象。 ...

网友评论

    本文标题:js中new操作符做了什么并实现自己的new操作符

    本文链接:https://www.haomeiwen.com/subject/ymtabrtx.html