2013-11-27 21 views
4

在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() 
+0

可能重复的[如何检测函数是否被称为构造函数?](http://stackoverflow.com/questions/367768/how-to-detect-if-a-function-is-called- as-constructor) – Oriol

+0

你的代码没有检测到像'var obj = MyObject.call(foo)' – Oriol

+0

这样的东西对不起,你为什么要*要?描述文档中的首选用法,但最终由开发人员决定如何使用/实现对象。这就是编程/脚本编程的美妙之处。 – zamnuts

回答

8

这是相当普遍的强制对象关键字时,被略去

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]; 
    } 
} 
0

,我发现这是这样,最后的答案用你的方法;

两种方式,本质上是相同的引擎盖下。你可以测试它的范围,或者你可以测试this.constructor是什么。

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

How to detect if a function is called as constructor?

编辑。

在本书中,Javascript Enlightment提到,不是必然的窗口,而是父对象;

在另一方面,如果你创建一个构造函数,并调用它 不使用new关键字的这个值是指包含函数 “父”的对象。

相关问题