我是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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在JavaScript中,对象是通过引用传递的。这意味着当你将一个对象赋值给另一个变量时,你实际上是在创建一个指向原始对象的新引用,而不是复制该对象。基于这个原理,让我们逐步理解你的代码:
初始化person对象:
const person = {
name: "bin",
walk() {
console.log(this);
}
};
这里创建了一个名为person
的对象,它有两个属性:name
和一个方法walk
。
调用person.walk():
person.walk();
这行代码执行了walk
方法。在JavaScript的方法中,this
关键字通常指向调用该方法的对象。因此,这里console.log(this)
打印出person
对象的当前状态,即{name: "bin", walk: ƒ}
。
创建per1作为person的引用:
const per1 = person;
per1
现在不是person
的一个副本,而是指向同一个对象的另一个引用。
修改per1.name:
per1.name = "cin";
因为per1
和person
指向同一个对象,所以当通过per1
改变name
属性时,person
对象的name
也会相应地变为"cin"。
再次调用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
对象,因此不会影响到person
或animal
的属性,只是在控制台打印出了animal
对象的信息。
最后再次调用person.walk()
时,因为没有改变person.walk
内部this
的绑定,它仍然指向person
对象,所以打印出的是更新后的person
对象信息,即name
为"cin"的状态。
总结来说,关键在于理解JavaScript中的对象是通过引用传递的,以及this
关键字在不同情况下的指向,还有bind
方法如何改变函数调用时的上下文(this
)。