javascript - 省略'new'关键字导致javascript构造函数出现无法解释的问题
问题描述
我是javascript的新手,正在研究构造函数和new
关键字。故意省略后new
,它会引起一些问题,我无法确切理解为什么会发生这种情况。
let Fruit = function (person, color) {
this.person = person;
this.color = color;
this.displayInfo = function () {
console.log(this.person + " is " + this.color);
}
}
let altFruit = function (person, color) {
this.person = person;
this.color = color;
}
let a1 = altFruit('Banana', 'Yellow'); //new keyword not written
let f1 = new Fruit('Orange', 'orange');
let aFunction = f1.displayInfo;
aFunction();
new
初始化对象时我没有写a1
。我将函数存储f1.displayinfo
在一个变量中,然后调用它。预期的输出是undefined is undefined
,但我得到了Banana is Yellow
。
这对我来说真的很莫名其妙,因为aFunction
与altFruit
构造函数或a1
. 另外,即使看了很多教程,我仍然不明白它的确切含义是什么,new
因为这个奇怪的输出只有在我省略它时才会发生。
解决方案
的值this
取决于函数的调用方式。
在非严格模式下,当你调用不带关键字的altFruit
函数时,里面会引用全局对象。所以,new
this
window
this.person = person;
person
将在全局window
对象上添加属性。window.person
(您可以通过在代码末尾登录控制台来测试它)。
aFunction
在非严格模式下调用时,this
内部displayInfo
函数的值将引用全局window
对象。
简而言之,您的代码window
分别在全局对象中添加和读取属性。
“新”运算符
new
运算符用于创建用户定义的对象类型(如Fruit
)或内置对象类型(如Array
、Date
等)的实例。
当你打电话时new Fruit(...)
,new
接线员会做以下事情:
创建一个新对象
__proto__
在指向对象的新创建的对象上添加属性Fruit.prototype
。this
在构造函数内部指向Fruit
新创建的对象。Fruit
从构造函数返回新创建的对象。
有关更多详细信息,请参阅:MDN: new operator
推荐阅读
- python - 使用 Selenium 通过“嵌套输入”类与下拉菜单交互?
- r - 如何在闪亮的数据表中插入使用 for 循环从函数获得的数据?
- python - Python OOP - 足球模拟
- php - PHP总和子字符串的最后6位数字
- javascript - 无法从 html 正确调用 vue 函数(组件渲染函数中的无限更新循环)
- java - if, else 具有多个约束和对话消息功能
- c# - 带有跟踪对象的 EF Core 更新
- math - C ++反向异或运算符?
- java - 如何拆分 URL 并仅获取主机名
- ansible - 在 regex_replace 的替换字符串中使用 ansible 变量