检测构造函数中是否使用了新关键字?

时间:2013-11-27 19:00:27

标签: javascript object

在JS中的构造函数对象中,如果它是在没有new关键字的情况下创建的,那么'this'变量是对窗口而不是对象的引用。尝试检测这个是一个特别明智的想法吗?

function MyObject ()
{
    if (this === window) {
        alert('[ERROR] Oopsy! You seem to have forgotten to use the "new" keyword.');
        return;
    }

    // Continue with the constructor...
}

// Call the constructor without the new keyword
obj = MyObject()

2 个答案:

答案 0 :(得分:8)

在省略关键字时强制使用 new 对象是相当常见的 -

function Group(O){
    if(!(this instanceof Group)) return new Group(O);
    if(!O || typeof O!= 'object') O= {};
    for(var p in O){
        if(O.hasOwnProperty(p)) this[p]= O[p];
    }
}

答案 1 :(得分:0)

我在SO中找到了这个,最后一个答案使用了你的方法;

  

两种方式,在引擎盖下基本相同。你可以测试一下   这个范围是或者你可以测试this.constructor是什么。

但是被接受的人说没有可靠的方法来做到这一点;

How to detect if a function is called as constructor?

EDIT。

在书中Javascript Enlightment提到不一定是窗口而是父对象;

  

另一方面,如果您创建一个构造函数并调用它   如果不使用new关键字,则此值将引用   包含该函数的“父”对象。