-1

したがって、新しいオブジェクトを作成するためのコンストラクター関数を作成するとき、 new キーワードは 3 つのことを行います。説明しますが、間違っている場合は訂正してください。正しいことを確認したいのです。

まず、コンストラクター関数を作成します

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

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

obj1 = new ObjectCreate();

new キーワードが最初に行うことは、新しいオブジェクトを作成し、その秘密のリンクをそのコンストラクターのプロトタイプに設定し、それをコンストラクター関数に渡すことです。ここで、コンストラクターがそれを参照できるようになりました。コンストラクターが作成を終了すると、この時点で obj1 を参照しないことにthis注意してくださいthisのみ、新しく作成されたオブジェクトを obj1 変数に返します。thisこの場合、obj1 オブジェクトを参照すると言う人もいるので、この質問をします。私もここにいます。

4

3 に答える 3

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.aされます。オブジェクト、そしてそれは役に立ちません。this.bthis.athis.b

それがあなたの質問に答えたことを願っています。そうでない場合は、さらに明確にするためにコメントを残してください。

于 2013-09-27T16:49:07.847 に答える
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コンテキストが変更されることを示しています。それを望まない場合は、関数の代わりにクロージャーを渡すか、 callapplyまたはbindを使用できます。

//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 ではそうではありません)。仕様へのリンクはありませんがthis、コンストラクター関数が戻ると obj1 が設定されます。

//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();

コンストラクター関数、プロトタイプ、継承、オーバーライド、super の呼び出しの詳細については、こちらをご覧ください。

于 2013-09-28T15:16:50.237 に答える
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"
于 2013-09-27T16:56:23.300 に答える