Javascript 为什么在使用“new”和不使用“new”调用函数时,“this”的工作方式不同

Javascript 为什么在使用“new”和不使用“new”调用函数时,“this”的工作方式不同,javascript,Javascript,我想知道为什么如果我不在Obj之前调用函数Bike,那么maker的Console.log的输出就是Bajaj 多功能自行车{ 变量名=忍者; this.maker=川崎; console.logthis.name++maker;//未定义的Bajaj } var名称=脉冲星; var maker=Bajaj; obj=新自行车; console.logobj.maker;//川崎当您不使用new调用函数时,这是全局窗口对象,因此this.maker相当于window.maker。全局变量是窗

我想知道为什么如果我不在Obj之前调用函数Bike,那么maker的Console.log的输出就是Bajaj

多功能自行车{ 变量名=忍者; this.maker=川崎; console.logthis.name++maker;//未定义的Bajaj } var名称=脉冲星; var maker=Bajaj; obj=新自行车;
console.logobj.maker;//川崎当您不使用new调用函数时,这是全局窗口对象,因此this.maker相当于window.maker。全局变量是窗口对象的属性,因此this.maker='Kawasaki正在重新分配全局变量maker

有关这方面的更多信息,请参见

全局名称空间窗口中定义的函数中的上下文

您可能需要创建一个类Bike,并为其指定属性,以供以后访问

let Bike = class {
  constructor(settings) {
    this.name = settings.name
    this.maker = settings.maker
    this.price = settings.price
  }
  get tax() { return 0.01 }
  changePrice(newPrice) {
    this.price = this.price + (this.tax * this.price)
    return this
  },
}
然后

let bike = new Bike({
  name: 'Some Name', 
  maker: 'Some Manufacturer',
  price: 1344, 
})
后来

bike.changePrice(1500)
在管理这样的数据对象时,可能会应用一些更高级的概念,但这是类工作原理的基础

否则,您需要创建返回应用属性的对象的函数,然后在对象上创建可以使用该属性引用自身的函数

function Bike(settings) {
  return {
    name: settings.name,
    maker: settings.maker,
    price: settings.price,
    tax: 0.01,
    changePrice: function(newPrice) {
      this.price = this.price + (this.tax * this.price)
      return this
    },
  }
}
相同的实例化

let bike = new Bike({
  name: 'Some Name', 
  maker: 'Some Manufacturer',
  price: 1344, 
})
相同的API用法

bike.changePrice(1500)

若声明了“use strict”指令,那个么这是未定义的。这是正确的,但和问题无关,因为它并没有出错。也许,但其他人可能想知道如何处理这个关键字。我不知道你们为什么这么好斗。我只是补充了一些清晰的评论。如果我的意见让你感到不安,那就把它标出来给版主。我会在这里找到我的解决方案。关于最初提供的示例,有很多未回答的问题,但是对于@Barmar最初打算实现的目标有一些合理的期望。在评论中看起来也有太多非建设性的对话。这令人沮丧。很高兴您找到了适合您的解决方案!