【问题标题】:Comparison of the two situations when the constructor is called without the new keyword不带new关键字调用构造函数的两种情况比较
【发布时间】:2020-05-12 15:42:36
【问题描述】:

function Person(name, age, gender) {
  this.name = name; // run
}

function PersonSafe(name) {
  if (!(this instanceof arguments.callee))
    return new PersonSafe(name)

  this.name = name; // run
}

var qux = Person('qux');
console.log('Person qux: ', qux);
console.log('[[global]] name: ', name);

var quxSafe = PersonSafe('qux');
console.log('PersonSafe qux: ', quxSafe);

在没有new关键字的情况下调用constructor时的两种情况的比较。

我不知道为什么两个代码运行的结果不同
bodyPerson()PersonSafe() 的功能不同,
quxquxSafe 将执行的行(this.name = name;)是相同的。
那么...为什么结果不同?

【问题讨论】:

  • stackoverflow.com/questions/8205691/array-vs-new-array 如果您想找出使用​​ new 和不使用 new 之间的区别。
  • 在没有new 的情况下调用函数只会像执行任何其他函数一样执行它。 Person 不包含 return 语句,因此它返回 undefined
  • @Tick20 您好,感谢您的评论。但是,这两个对象是在没有 new 关键字的情况下创建的。
  • @snaag PersonSafe 包含 return 语句。如果没有使用new 调用它,它会使用new 递归调用自身。这就是区别。
  • @JLRishe 哦,我的.....哦,我真的真的很笨......哇......我明白了!哇..谢谢..哈哈...

标签: javascript constructor


【解决方案1】:

这个不同的主要原因是“new”关键字造成的,这意味着函数将被视为对象,它会被分配proto属性。

这个变量也将指向新创建的对象。

这里有很好的描述:What is the 'new' keyword in JavaScript?

【讨论】:

    【解决方案2】:

    当您将函数作为构造函数调用时(此处为 Person),将创建一个对象(其内部原型为构造函数原型的空对象 - 此处为 Person.prototype),并且该对象刚刚创建的 em> 是函数内部的 this 值将指向的内容。该对象也将在构造函数的末尾隐式返回。

    相反,当您使用new 时,不会创建这样的对象;您只是在调用一个普通函数,其中的 this 值将取决于函数的调用上下文。在这里,因为没有调用上下文(被调用的函数不是对象的一部分),所以函数内部的this要么是全局对象(在草率模式的情况下),要么是undefined(在这种情况下严格模式)。

    所以var qux = Person('qux'); 运行this.name = name,其中this 是全局对象。

    使用PersonSafe,您正在检查this 是构造函数的一个实例(this 具有构造函数原型的内部原型)- 如果在没有new 的情况下调用,该测试将失败,因为this 将是全局对象或undefined

    请注意,arguments.callee 在严格模式下是被禁止的,并且几乎总是应该使用严格模式。考虑替换为new.target

    function PersonSafe(name) {
        if(!(new.target))
            return new PersonSafe(name)
    
        this.name = name; // run
    }
    
    var quxSafe = PersonSafe('qux');
    console.log('PersonSafe qux: ',quxSafe);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-21
      • 1970-01-01
      • 2015-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多