【问题标题】:Number vs new Number internal implementationNumber 与新 Number 内部实现
【发布时间】:2019-03-22 06:42:44
【问题描述】:

我理解这种写法

var x = Number("7"); // makes a number, a primitive
var y = new Number("7"); // makes a Number object

而且我知道对选项 2 的常见注意事项,但幕后发生了什么?我的印象是,如果一个函数是一个构造函数,它不应该通过 return 语句返回一个值:它只是设置它的隐式对象 this,然后返回它。

那么 Number、String 和 Boolean 构造函数如何能够返回原始类型或对象呢? JavaScript 引擎是否以不同的方式解析这些表达式作为语言的特殊功能?或者程序员也可以“重载”一个构造函数来返回一个基元或一个对象,这取决于构造函数是在有/没有“new”的情况下被调用的吗?

【问题讨论】:

    标签: javascript object constructor primitive


    【解决方案1】:

    它与语法无关,这些构造函数也没有什么特别之处。 Number() 和其他构造函数只是在继续之前测试this 是否已绑定。

    你也可以这样做:

    function MyConstructor() {
      if (!this) return new MyConstructor();
      // stuff ...
    }
    

    现在调用MyConstructor() 的行为与new MyConstructor() 完全相同。

    另外,构造函数可以返回一些东西。如果它返回一个对象,则使用该对象而不是 new 创建的隐式构造对象。因此,您还可以通过另一种方式实现“new-is-optional”构造函数:

    function MyConstructor() {
      let object = this || Object.create(MyConstructor.prototype);
      // stuff ...
      return object;
    }
    

    所以Number() 构造函数采取了不同的策略。在大多数运行时,它实际上可能会或可能不会被实现为 JavaScript,但如果是的话,它可能看起来像这样:

    function Number(n) {
      if (this) {
        // invoked with "new"
        this.fantasyValueSetter(n); // cannot really do this
        return this;
      }
      return +n; // plain number primitive if not invoked with "new"
    }
    

    【讨论】:

    • 这就是我一直在寻找的答案!感谢您提供的清晰示例。
    【解决方案2】:

    使用构造函数,Number 对象将是一个对象,而使用函数 Number 将返回一个对象到其表示形式的数值转换。

    因此,基本上在Number 对象中,该函数正在验证调用方式。这可以通过检查对象this 来实现。

    有趣的事情是将Number 对象强制转换为如下数值:

    var x = Number("7"); // makes a number, a primitive
    var y = new Number("7");
    
    console.log(x === +y)

    去阅读规范

    https://www.ecma-international.org/ecma-262/5.1/#sec-15.7

    【讨论】:

    • 感谢您的直接参考!很高兴看到规范中实际写了什么。
    猜你喜欢
    • 1970-01-01
    • 2021-10-16
    • 2015-03-11
    • 2015-04-23
    • 2017-04-21
    • 1970-01-01
    • 1970-01-01
    • 2022-07-18
    • 1970-01-01
    相关资源
    最近更新 更多