如果是新的'用于实例化具有工厂功能的对象是否会改变任何东西?

时间:2018-05-09 01:11:13

标签: javascript object

在下面的测试代码中,我使用工厂函数以传统方式实例化新对象,而不使用new关键字。它按预期工作。



function testThis(x) {
   let middleStep = {
        firstNumber: x.firstNumber,
        secondNumber: x.secondNumber
    }
    return middleStep;
}

let newObject = testThis({firstNumber: 'ONE', secondNumber: 'TWO'});
// new keyword not used

console.log(newObject.firstNumber);




在下一个示例中,我使用相同的方法,但包含new关键字。它产生相同的输出,表面看起来也是一样的。 new关键字在此上下文中使用时是否会更改,或者结果是否相同?



function testThis(x) {
   let middleStep = {
        firstNumber: x.firstNumber,
        secondNumber: x.secondNumber
    }
    return middleStep;
}

let newObject = new testThis({firstNumber: 'ONE', secondNumber: 'TWO'});
// new keyword included

console.log(newObject.firstNumber);




3 个答案:

答案 0 :(得分:1)

'new'将创建一个函数对象。当你只调用一个函数时,'this'将被引用到窗口。但如果它是一个“新”对象,那么'this'就是指对象本身。

答案 1 :(得分:1)

如果函数返回一个对象,则使用new调用该对象将是多余的,相当于在没有new的情况下调用它。来自MDN

  

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

     
      
  1. 创建一个新对象,继承自Foo.prototype
  2.   
  3. 使用指定的参数调用构造函数Foo,并将其绑定到新创建的对象。 new Foo等价于new Foo(),即如果没有指定参数列表,则不带参数调用Foo。
  4.   
  5. 构造函数返回的对象成为整个新表达式的结果。 如果构造函数没有显式返回对象,则使用在步骤1中创建的对象。(通常构造函数不返回值,但如果他们想要,他们可以选择这样做覆盖正常的对象创建过程。)
  6.   

答案 2 :(得分:1)

我在java脚本中提供了一些关于“new”和“functions”用法的一般信息 1.“新”也可以用于功能。它将被视为函数构造函数。当我们这样做时,作为一般的编码实践,我们将第一个字符为大写的函数命名为

  1. 当JS引擎看到“new”运算符(是“new”是一个运算符并且具有优先级“)时,它会在内存中创建一个空对象,引擎会将”this“引用分配给这个新创建的空对象。
    在函数构造函数的末尾,JS引擎将使用我们在构造函数内创建的属性填充空对象并自动返回该对象。
    例如:

    //这是一个函数构造函数,它接受两个参数
    function Human(名字,姓氏){
        this.firstname = firstname; //“this”将指向humanIdentity
        this.lastname =姓氏;
        // JS引擎会自动返回具有上述属性的对象
    }

    var humanIdentity = new Human('Mr。','JS');