JavaScript的这个对象以我想的方式引用新创build的对象

所以,当我们为创build新对象创build构造函数时,新的关键字会做3件事情,我会解释它,但如果我错了,请纠正我,我想确保我是正确的

首先我将创build一个构造函数

function ObjectCreate(){ this.a = "a"; this.b = "b"; ObjectCreate.prototype.show = function(){ alert(this.a+" "+this.b); } } obj1 = new ObjectCreate(); 

现在new关键字所做的第一件事就是创build一个新对象,并将它的秘密链接设置为构造函数的原型,并将其传递给构造函数,现在可以引用它,请注意, this没有提到obj1,因为构造函数完成创build对象才会将新创build的对象返回给obj1variables。 我问这个问题,因为有些人说this是指在这种情况下的obj1对象。 所以我就在这里。

在这个示例中,在构造函数调用期间, obj1是未定义的。 ObjectCreate函数返回后,赋值给obj1variables。

你可以检查你自己:

 function ObjectCreate(){ this.a = "a"; this.b = "b"; alert(obj1); // yields "undefined" ObjectCreate.prototype.show = function(){ alert(this.a+" "+this.b); } } var obj1 = new ObjectCreate(); // note "var" 

你的措辞有点混乱,但我会尽我所能。 首先,你应该注意你的大括号是有点偏离。 你的代码应该是这样的:

 function ObjectCreate(){ this.a = "a"; this.b = "b"; } ObjectCreate.prototype.show = function(){ alert(this.a+" "+this.b); } obj1 = new ObjectCreate(); 

您需要定义您的构造函数, 然后将其附加到其原型。

当你调用构造函数时, this关键字基本上是指新build的对象。 这很重要,因为,例如,你可以写一个构造函数,如:

 function ObjectCreate(x,y){ this.a = x*x; this.b = y*x+4; } obj1 = new ObjectCreate(10,20); 

在这里,和所有的构造函数一样, this引用了正在创build的实例( obj1 ,在这种情况下)。

我认为你认为this是指对象的原型,但这会使this.bthis.b静态variables,这将是一个像这样的构造函数无用,因为每次你初始化一个新的对象,你会改变对于所有以前存在的对象来说, this.bthis.bthis.a就是没有用的。

我希望能回答你的问题。 如果没有,请继续留下评论以作进一步澄清。

似乎没有人提到this是指invoking object

 window.sayHi=function(){ console.log(this.name); } window.name="Window" window.sayHi();//=Window var obj={ name:"obj" } obj.fn=window.sayHi; obj.fn();//=obj 

上面的代码显示,在this上下文中传递函数的时候会改变。 如果你不想这样做,那么你可以通过一个闭包而不是函数或使用调用 , 应用或绑定 :

 //closure example obj.fn=(function(w){//w is available because the returned function is a closure return function(){ w.sayHi(); } }(window)); obj.fn();//=Window //using call obj.fn.call(window);//=Window //using apply obj.fn.apply(window);//=Window //using bind var boundFn=obj.fn.bind(window); boundFn();//=Window 

那是当你传递一个函数作为另一个对象的参数。 当你使用构造函数的时候, this函数体内的内容将引用要创build的对象。

但是当你传递它的function时,它可能不是:

 var obj={ name:"obj" } var Test=function(){ this.name="Test"; } Test.prototype.sayHi=function(){ console.log(this.name); }; var t=new Test(); obj.fn=t.sayHi t.sayHi();//=Test obj.fn();//=obj 

在将对象实例函数传递给setTimeout或事件处理函数时,这是大多数人陷入的陷阱:

 someButton.onclick=t.sayHi;//when button is clicked this will be the button clicked setTimeout(t.sayHi,100);//when sayHi is executed 'this' will be window 

回答你在构造函数体内存在的关于obj1的问题; 我会说不(至less在Firefox中)。 我没有链接到规范,但obj1将被设置为this构造函数返回时:

 //clean up window.t delete window.t; var Test=function(){ this.name="Test"; console.log("and window.t is:",window.t);//undefined } Test.prototype.sayHi=function(){ console.log(this.name); }; window.t=new Test(); 

更多关于构造函数,原型,inheritance,覆盖和调用超级在这里 。