开发者社区 问答 正文

Javascript提供令人困惑的输出

我是Java语言的新手,来自Java背景。

const person = {
  name: "bin",
  walk() {
    console.log(this);
  }
};
person.walk();
const per1 = person;
per1.name = "cin";
per1.walk();

const animal = {
  type: "2",
  m2() {
    console.log("type");
  }
};
const walk1 = person.walk.bind(animal);
walk1();
person.walk();

我无法理解第1行的输出,该输出显示name的值cin。当代码在person.walk()处执行时;名称的值未更改。然后如何将值打印为cin。请帮我理解

{name: "bin", walk: ƒ}name: "cin"walk: ƒ walk()__proto__: Object
{name: "cin", walk: ƒ}name: "cin"walk: ƒ walk()__proto__: Object
{type: "2", m2: ƒ}type: "2"m2: ƒ m2()__proto__: Object
{name: "cin", walk: ƒ}name: "cin"walk: ƒ walk()__proto__: Object

展开
收起
几许相思几点泪 2019-12-22 18:26:42 637 分享 版权
阿里云 AI 助理回答

在JavaScript中,对象是通过引用传递的。这意味着当你将一个对象赋值给另一个变量时,你实际上是在创建一个指向原始对象的新引用,而不是复制该对象。基于这个原理,让我们逐步理解你的代码:

  1. 初始化person对象:

    const person = {
     name: "bin",
     walk() {
       console.log(this);
     }
    };
    

    这里创建了一个名为person的对象,它有两个属性:name和一个方法walk

  2. 调用person.walk():

    person.walk();
    

    这行代码执行了walk方法。在JavaScript的方法中,this关键字通常指向调用该方法的对象。因此,这里console.log(this)打印出person对象的当前状态,即{name: "bin", walk: ƒ}

  3. 创建per1作为person的引用:

    const per1 = person;
    

    per1现在不是person的一个副本,而是指向同一个对象的另一个引用。

  4. 修改per1.name:

    per1.name = "cin";
    

    因为per1person指向同一个对象,所以当通过per1改变name属性时,person对象的name也会相应地变为"cin"。

  5. 再次调用person.walk():

    per1.walk();
    

    再次调用walk方法,由于name已经被改为"cin",所以这次console.log(this)输出的是更新后的对象信息,即{name: "cin", walk: ƒ}

至于bind方法的部分:

const walk1 = person.walk.bind(animal);
walk1();

bind方法创建了一个新的函数,这个新函数的this被永久绑定到传入的animal对象上。所以,当调用walk1()时,尽管这个方法原本定义在person对象上,但它的this已经绑定到了animal对象,因此不会影响到personanimal的属性,只是在控制台打印出了animal对象的信息。

最后再次调用person.walk()时,因为没有改变person.walk内部this的绑定,它仍然指向person对象,所以打印出的是更新后的person对象信息,即name为"cin"的状态。

总结来说,关键在于理解JavaScript中的对象是通过引用传递的,以及this关键字在不同情况下的指向,还有bind方法如何改变函数调用时的上下文(this)。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答