所以这是我的代码,您可以看到您有一个名为“ Obj”的对象 一个名为“ myClass”的类,该类创建的对象与“ Obj”对象相同,但是从myClass创建的对象“ newObj”中的run方法输出不同的结果,这没有意义,因为两个对象都是100%相同>
var x = 10; //global var
var Obj = {
x:30 ,
run : () => {
console.log(this.x);
}
}
console.log(Obj)
Obj.run() //outputs 10
//a class which creates the same 'Obj' Object
class myClass {
constructor() {
this.x=30
this.run = () => {
console.log(this.x)
}
}
}
var newObj = new myClass()
console.log(newObj); //outputs an object which is as identical as the 'Obj' Object
newObj.run(); //outputs 30 instead of 10
就是这样 预先感谢
答案 0 :(得分:3)
由于在对象内部使用箭头功能,因此this
变为window
,而不是Obj
。但是在类中,run函数位于构造函数内部,使this
成为对象,而不是window
。如果要让对象打印对象x,则需要使用Obj.x
。
var Obj = {
x:30 ,
run : () => {
console.log(Obj.x);
}
}
即使两个对象都在同一范围内,也不会在同一范围内创建,并且它们也不会以相同的方式创建。类是构造函数,对象不是。
如果您确实想使用this
关键字,则可以将其替换为run : () =>
而不是run ()
。然后,您可以使用this.x
代替Obj.x
。有点像在类中(在其构造函数之外)定义函数。
var Obj = {
x:30 ,
run () {
console.log(this.x);
}
}
答案 1 :(得分:0)
假设这是在浏览器中,则当您说var x = 10; // global var
时,全局对象就是浏览器的window
,因此您说的是window.x = 10;
然后,您创建自己的“ Obj”并为其分配其 x,x:30
,但是您仍处于全局上下文中,因此在其中,当“ run”运行时,{{1 }}仍指this
,而window
为10。
当您拥有window.x
并将其中一个构造为myClass
时,此时newObj
指的是构造对象,因此{{1 }}指的是 classes 成员this
,即30。
在控制台中查看时,它们看起来可能相同,但这是因为控制台两次都在相同的范围内工作。尝试在您执行this.x
的每行上放置一个断点,并在遇到断点时检查x
和console.log
的值。。 / p>
答案 2 :(得分:0)
只需将运行功能更改为
run() {
console.log(this.x);
}
var x = 10; //global var
var Obj = {
x:30 ,
run() {
console.log(this.x);
}
}
console.log(Obj)
Obj.run() //outputs 10
//a class which creates the same 'Obj' Object
class myClass {
constructor() {
this.x = 30
this.run = () => {
console.log(this.x)
}
}
}
var newObj = new myClass()
console.log(newObj); //outputs an object which is as identical as the 'Obj' Object
newObj.run(); //outputs 30 instead of 10