Javascript 是否可以重新创建;新";JS中的操作员?

Javascript 是否可以重新创建;新";JS中的操作员?,javascript,reflection,Javascript,Reflection,我最近读了这本书,书中简洁的描述让我印象深刻: 当执行代码new Foo(…)时,会发生以下情况: 将创建一个从Foo.prototype继承的新对象 使用指定的参数调用构造函数Foo,并将其绑定到新创建的对象新Foo等同于 new Foo(),即如果未指定参数列表,则调用Foo 没有争论 构造函数返回的对象成为整个新表达式的结果。如果构造函数没有 显式返回一个对象,使用在步骤1中创建的对象 相反(通常构造函数不返回值,但它们可以 如果要覆盖普通对象创建,请选择这样做 过程。) 这些似乎都不是特

我最近读了这本书,书中简洁的描述让我印象深刻:

当执行代码new Foo(…)时,会发生以下情况:

  • 将创建一个从Foo.prototype继承的新对象
  • 使用指定的参数调用构造函数Foo,并将其绑定到新创建的对象<代码>新Foo等同于
    new Foo()
    ,即如果未指定参数列表,则调用Foo 没有争论
  • 构造函数返回的对象成为整个新表达式的结果。如果构造函数没有 显式返回一个对象,使用在步骤1中创建的对象 相反(通常构造函数不返回值,但它们可以 如果要覆盖普通对象创建,请选择这样做 过程。)
  • 这些似乎都不是特权操作,那么是否可以用其他语言构造完全重新创建
    new
    的操作


    请注意,我不计算,因为它的定义是“作为一个函数,它的行为类似于新操作符”。

    此函数几乎重新创建了
    Reflect.construct
    ,因此
    new
    (除了
    construct
    的最后一个参数,它在使用
    new
    操作符时没有等价物:

    function fauxNew (constructor, args) {
    
        // allocate a new object and set the prototype
        var newObject = Object.create(constructor.prototype)
    
        // call the constructor with "this" bound to the new object
        var retVal = constructor.apply(newObject, args || [])
    
        // if the constructor returned an object, return it; 
        // otherwise return the new object
        var constructorReturnedAnObject = 
            !!retVal && ["object", "function"].indexOf(typeof retVal) !== -1
        return constructorReturnedAnObject? retVal : newObject
    }
    

    以下是。

    在检测对象时不要信任
    typeof
    。对于不可调用的非标准外来对象,它可能会返回奇怪的东西,例如
    “未知”
    对象(retVal)===retVal
    更可靠。请注意,由于ES6必须使用
    Reflect.construct
    ,以上描述来自ES5。使用
    class
    语法定义的一些内置和构造函数确实区分了作为构造函数调用和作为方法调用。