2015-11-23 72 views
-1

所有使用bind()?像:如何在JS对象初始化

var a = { 
    name:"nihao", 
    hello: (function(){ 
     console.log(this.name); 
    }).bind(this) 
} 

当我运行a.hello(),这是窗口。然后我改变了代码:

var a = { 
    name:"nihao", 
    hello: (function(){ 
     console.log(this.name); 
    }).bind(a) 
} 

没有什么变化,所以我不知道如何可以绑定一个,因为这时候我初始化此对象吗?

谢谢

+0

@HunanRostomyan谢谢,你的意思是在这两种情况下?我试过了,但都不起作用 – Kuan

+0

删除定义内的绑定,并在调用过程中绑定它。例如,'a.hello.call({名称:'封'})'将打印“关”。 –

+0

不用说,如果你只是叫'a.hello.call(a)',你会得到“nihao”。 –

回答

1

在这种情况下,您需要在稍后的时间绑定函数;一旦“a”已经初始化。

a.hello = (function hello(){}).bind(a); 
+0

谢谢,所以这意味着我只能在init之后做这个绑定,对吧? – Kuan

+0

如果你想绑定到“a”,在这种情况下是的。 – Ben

+0

好的。谢谢。你可以给我一点细节,为什么在init中绑定不工作(如JS引擎如何处理这个) – Kuan

1

首先,不添加绑定对象定义中:

var a = { 
    name: "nihao", 
    hello: function(){ 
    console.log(this.name); 
    } 
} 

然后,在通话过程中,传递你想成为什么对象this

a.hello.call(a); 
// => "nihao" 

a.hello.call({name: "Kuan"}); 
// => "Kuan" 
+0

谢谢,明白吧。 – Kuan

0

为什么不?

var a = { 
 
    name:"nihao", 
 
    hello: function(){ 
 
     console.log(this.name); 
 
    } 
 
} 
 

 
a.hello();

缺省情况下,物体内部的功能属性绑定到该实例。

+0

感谢提问,我想阻止“这个”的变化 – Kuan

+0

您能澄清一下这种情况可能会改变吗?尝试了解您正在尝试解决的上下文。 –

+0

感谢您提问,例如var b = {} b.hello = a.hello – Kuan