我目前正在使用一本书学习JavaScript。一个例子解释了功能的双重目的。
function Person(name) {
if (this instanceof Person) {
this.name = name
} else {
throw new Error("Nutze new")
}
}
let aPerson = new Person("Astrid");
// let aPerson = Person("Astrid"); // throws an error
let notAPerson = Person.apply(aPerson, ["Elmar"]);
let notAPerson2 = Person.call(aPerson, "Peter");
console.log(aPerson); // Object { name: "Peter" }
console.log(notAPerson); // undefined
console.log(notAPerson2); // undefined
我了解,我可以使用contex
或apply()
方法设置call()
。
但是我不明白,为什么变量notAPerson
和notAPerson2
未定义?
如果有人可以向我解释这一点,那就太好了。
答案 0 :(得分:1)
new
关键字更改函数的执行方式。在不使用new
的情况下使用时,它将完全按照其在函数主体中的说明进行操作。但是,当您使用new
调用函数时,它的工作原理如下:
function Person(name) {
var this = {}
if (this instanceof Person) {
this.name = name
} else {
throw new Error("Nutze new")
}
return this
}
因此,当您使用new
调用函数时,this
是一个全新的对象,它将自动返回。稍后在不使用new
的情况下调用该函数时,this
是您先前创建的aPerson
对象,因为您正在使用call
和apply
来显式设置上下文。 。另外,当您不使用new
时,该函数不返回任何内容,它仅分配给this
,这就是notAPerson
和notAPerson2
保持未定义状态的原因。 / p>