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' 一次。

我知道这是为什么。这是因为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 回答