gpt4 book ai didi

javascript - 不带new关键字调用构造函数时的两种情况对比

转载 作者:行者123 更新时间:2023-11-28 16:51:12 25 4
gpt4 key购买 nike

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);

enter image description here

不使用 new 关键字调用构造函数时两种情况的比较。

我不知道为什么两个代码运行的结果不同
Person()PersonSafe() 函数的 body 不同,
但是 (this.name = name;),quxquxSafe 将执行的内容是相同的。
那么...为什么结果不同?

最佳答案

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

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

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

使用 PersonSafe,您可以检查 this 是否是构造函数的实例(this 具有构造函数的内部原型(prototype))构造函数的原型(prototype)) - 如果在没有 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);

关于javascript - 不带new关键字调用构造函数时的两种情况对比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59928186/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com