所以我有一个关于this的问题,就是在类中有正常变量。
通常我们会做这样的事情:
class Thingy {
constructor(thing) {
this.id = thing
}
printID() {
console.log(this.id)
}
}
let newthingy = new Thingy("ID1")
let newthingy2 = new Thingy("ID2")
newthingy.printID()
newthingy2.printID()它工作得很好,但是这样的事情不会:
class Thingy {
constructor(thing) {
let id = thing
}
printID() {
console.log(id)
}
}
let newthingy = new Thingy("ID1")
let newthingy2 = new Thingy("ID2")
newthingy.printID()
newthingy2.printID()因此,我知道newthingy将不知道id是什么,所以它不只是查找原型链回原来的类原型吗?我意识到它可能无法得到正确的id,但是为什么我们会得到一个id not defined error,它应该首先查找原型链吗?
发布于 2017-05-23 05:32:47
这与原型完全无关。它比你想象的要简单得多:
“类方法”仅仅是作用于一个对象的函数。它们对对象的作用方式是通过this进行的。这就是全部。它是一个普通函数,它有对this的隐式访问,它是一个对象。因为在Javascript中,this的值是在调用时决定的,所以这是一种非常灵活的机制:
function foo() {
console.log(this.bar);
}
foo.call({ bar: 'baz' });
let baz = { bar: 'baz' };
baz.foo = foo;
baz.foo();
正如您所看到的,您甚至不需要一个class就可以让this工作。一个类只是将其形式化为一个特定的模式:
new Thingy在设置为this.id = thing的构造函数中创建一个新对象并在其上调用Thingy constructor,在该新对象上创建id属性。然后调用newthingy.printID()时,调用printID函数将其this上下文设置为先前创建的对象(newthingy),因此this.id工作。
id值作为对象的属性从constructor传输到printID。如果您只使用id (而不是this.id),那么您只是试图访问一个不存在的局部变量。
发布于 2017-05-23 03:41:16
我相信这都是关于范围的。你说..。
let id = thing..。实际上,您声明的变量是构造函数方法的本地变量。当你定义..。
this.id = thing..。它实际上是修改Thingy实例的属性值。而且,当printID试图访问"id“时,它没有上下文可以在其中找到"id”。
发布于 2017-05-23 06:11:21
“构造函数”和“printID”都是在它们处定义的functions.Variables,其他人无法到达。
https://stackoverflow.com/questions/44125378
复制相似问题