Javascript [this]与新的关键字绑定
这个问题在这里已经有了答案:
因为任何函数都可以是构造函数。 想象一下,如果你自己使用foo
:
var obj3 = new foo(3);
你也希望得到一个类似的对象{ a: 3 }
,对吧?
即使函数连接到其他东西,这仍然可以工作。 每次你使用new
你都在创建一个新的对象,而不是改变现有的对象。
首先,您将该函数用作方法:
obj1.foo(2);
在这种情况下,上下文被设置为obj1
因为它是调用它的那个。 但是,当您使用new
品牌时,会创建一个新对象并将该新对象用作上下文。
当调用此obj1.foo( 2 )
在执行的方法obj1
作为参数传递的2.当foo
执行定义了属性调用a
到调用对象和分配给它的值something
在这种情况下,2。 这种情况下的calling
对象是obj1
。 因此,由于这个原因, obj1
获得了a
值为2的属性。
如果我评论这行:obj1.foo(2)上面的日志的结果是未定义的。
发生这种情况是因为如果你评论你提到的那一行。 obj1
不会获得属性a
。 因此,在这种情况下a
是不确定的。 一般来说,如果我们考虑一个空对象obj
, obj = {}
。 如果您执行以下操作:
obj.a
您可以在对象obj
上定义一个名为a
的属性。 此外,如果您执行以下操作:
obj.a = 4;
你做了两件事,你定义了属性a
并给它赋值。
所以,让我们把它分解成更小的步骤。
首先, obj1.foo
调用foo
函数。 foo
函数接受一个参数并将该参数赋值给调用foo的对象的a
键(这比这更复杂一些,如果你愿意,我可以详细说明)。
所以当你调用obj1.foo(2)
,你调用了foo
方法,通过obj1
对象的角度传入参数2
。 这就是为什么obj1.a
将等于2。由于这是分配一个值到命令obj1.a
,该呼叫的忽略都会obj1.a
是未定义的。