zoukankan      html  css  js  c++  java
  • new 操作符 做了什么

    new 操作符 做了什么

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

    假设Test是一个构造函数,通常在创建对象的实例时,要使用new,eg:test = new Test() , 那么在调用new的时候,发生了什么呢?

    步骤如下:
    1.一个继承自 Test.prototype 的新对象被创建。可以理解为:

        // 创建一个空对象,继承构造函数的prototype(继承公共方法)
        let temp = {};
        temp.__proto__ = Test.prototype
    

    2.使用指定的参数调用构造函数 Test ,并将 this 绑定到新创建的对象。new Test 等同于 new Test(),也就是没有指定参数列表,Test 不带任何参数调用的情况。可以理解为:

        // 绑定this到新创建的对象,执行构造函数(创建实例的成员变量)
        Test.call(temp)
    

    3.由构造函数返回的对象就是 new 表达式的结果。如果构造函数没有显式返回一个对象,则使用步骤1创建的对象。(一般情况下,构造函数不返回值,但是用户可以选择主动返回对象,来覆盖正常的对象创建步骤

        //默认情况下,返回最初创建的对象,也可以主动返回对象进行覆盖
        test = temp
    

    如果主动返回的不是对象,则会被无视,还是使用最初创建的对象

        function Test() {
            return 'test-string'
        }
    
        console.log(new Test()) // Test {} 返回的是空对象,为Test的实例
    

    注意:

    1. 箭头函数不能作为构造函数,因为箭头函数没有自己的this,所以不可以使用new,会报错!
    2. 如果构造函数在调用时,没有加new操作符,执行过程中this会为window/undefined,无法正常生成实例。
  • 相关阅读:
    ==和equals
    instanceof和相关函数
    格式化输出
    [转]使用String的intern方法节省内存
    [转]请别再拿“String s = new String("xyz");创建了多少个String实例”来面试了吧
    Go编程语言学习笔记
    [javascript]什么是闭包?
    [javascript]彻底理解 JS 中 this 的指向
    constrained属性
    Python python 数据类型的相互转换
  • 原文地址:https://www.cnblogs.com/shapeY/p/10365983.html
Copyright © 2011-2022 走看看