javascript的这个对象以我的思维方式引用新创建的对象

时间:2013-09-27 16:40:33

标签: javascript constructor

因此,当我们创建用于创建新对象的构造函数时,new关键字会执行3项操作 我要解释一下,但如果我错了,请纠正我,我想确定我是正确的

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

function ObjectCreate(){
    this.a = "a";
    this.b = "b";

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

obj1 = new ObjectCreate();

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

3 个答案:

答案 0 :(得分:2)

你的措词有点令人困惑,但我会尽我所能。首先,你应该注意你的花括号有点偏。您的代码应如下所示:

function ObjectCreate(){
   this.a = "a";
   this.b = "b";
}

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

obj1 = new ObjectCreate();

你需要定义你的构造函数,然后将东西附加到它的原型。

当你调用构造函数时,this关键字 基本上是指正在创建的新对象。这很重要,因为,例如,您可以编写如下构造函数:

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

在这里,与所有构造函数一样,this指的是正在创建的实例(在这种情况下为obj1)。

我认为你建议this引用对象的原型,但这会使this.athis.b静态变量,这在像这里的构造函数中是无用的,因为每次初始化新对象时,您都会为所有以前存在的对象更改this.athis.b的值,而这只是没用。

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

答案 1 :(得分:0)

在此示例中,在构造函数调用期间,obj1未定义。在obj1函数返回后,值被分配给ObjectCreate变量。

你可以自己检查:

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"

答案 2 :(得分:0)

似乎没有人提到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代替该功能,或使用callapplybind

//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将引用要创建的对象。

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

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的问题;我会说不(至少在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();

有关构造函数,原型,继承,覆盖和调用超级here的更多信息。