2

私はこのコードを持っています:

var obj = function (i) {
   this.a = i;
   this.init = function () {
       var _this = this;
       setTimeout(function () {
           alert(_this.a + ' :: ' + typeof _this);
       }, 0);
   };
   this.init();
};

obj('1');
obj('2');
obj('3');
new obj('4');​​​

http://jsfiddle.net/kbWJd/

このスクリプトは、'3 :: object' を 3 回、'4 :: object' を 1 回警告します。

私はこれがなぜなのか知っています。これnew obj('4')は、独自のメモリ空間を持つ新しいインスタンスを作成し、以前の呼び出しがメモリ空間を共有しているためです。「オブジェクト」とだけ言っているobjので、自分が新しいオブジェクトなのか関数なのかをどのように判断できますか?typeof _this

ありがとう。

4

2 に答える 2

2

これはあなたが探しているものですか?new関数内でキーワードを使用せずに関数を実行すると、含まれているオブジェクト (この場合)thisと等しくなります。window

if( this === window ){
    console.log('not an object instance');
} else {
    console.log('object instance');
}

別の包含オブジェクトの例:

var obj = {

    method: function(){

        if( this === obj ){
            alert('function was not used to create an object instance');
        } else {
            alert('function was used to create an object instance');
        }

    }

};


obj.method(); // this === obj

new obj.method(); // this === newly created object instance
于 2012-06-29T22:54:54.883 に答える
2

instanceof演算子は、別のソリューションに利用できます。

var foo = function() {
    if (this instanceof foo) {
        // new operator has been used (most likely)
    } else {
        // ...
    }
};
于 2012-06-29T23:03:31.937 に答える