javascript - 不带new关键字调用构造函数的两种情况比较
问题描述
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);
在没有关键字的情况下constructor
调用的两种情况的比较。
我不知道为什么运行这两个代码的结果不同。of和函数不同,但和将执行
的行 ( )是相同的。那么......为什么结果不同?new
body
Person()
PersonSafe()
this.name = name;
qux
quxSafe
解决方案
当您将函数作为构造函数调用时(此处Person
为. 该对象也将在构造函数的末尾隐式返回。Person.prototype
this
相反,当您不使用时new
,不会创建这样的对象;您只是在调用一个普通函数,其中的this
值将取决于函数的调用上下文。在这里,因为没有调用上下文(被调用的函数不是对象的一部分),this
所以函数内部要么是全局对象(在 sloppy 模式的情况下),要么是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);
推荐阅读
- c# - 用于过滤数据透视表的 OpenXML 示例?
- javascript - 比较两个无法正常工作的复杂数组
- swift - 从 Firebase 表 Swift 获取用户用户名
- google-slides-api - 是否可以在嵌入的 Google 幻灯片演示文稿中使用外部控制元素?
- reactjs - React - 当服务器上的数据发生变化但没有道具发生变化时重新渲染
- python - 将 jpype 降级到 0.6.3
- json - 在 REST API 请求中指定多个项目或所有项目
- formal-languages - 如何为给定的语言构建下推自动机
- c# - OleDbConnection 外部表不是预期的格式
- jquery - 在同一站点上打开一个窗口