2013-05-13 36 views
3

我想创建一个对象,返回没有在JavaScript中的关键字new返回一个对象,但不使用新的关键字,Javascript?

到目前为止我的代码结构;

myLib.func = (function() { 

    "use strict"; 

    function func() { 

     this._init(); 
    }; 

    func.prototype._init = function() { 

     this.someVar = 5; 
    }; 

    Return func; 

})(); 

这显然只适用于使用关键字new;

new myLib.func(); 

我该怎么做才能做到;

var func = myLib.func(); 

但它仍然会返回一个与第一个例子完全相同的对象吗?

我已经试过

myLib.func = (function() { 

    "use strict"; 

    function func() { 

     if (window === this) { 
      return new myLib.func(); 
     } else { 
      this._init(); 
     } 
    }; 

    func.prototype._init = function() { 

     this.someVar = 5; 
    }; 

    Return func; 

})(); 

这不工作,我从一个例子学到了约翰Resig的建设图书馆技巧滑动器25,http://ejohn.org/blog/building-a-javascript-library/

我知道目前已经有现有的框架,但是滚动自己会让我学到很多东西,正如你现在看到的那样不是很多!

回答

2

strict mode中,this默认为undefined

if (window === this || undefined === this) { 
     return new myLib.func(); 
    } else { 
     this._init(); 
    } 

或通过检查目前的对象是(使用instanceof)的构造函数的实例:您可以将其添加到您的情况考虑这个功能。

if (this instanceof func) { 
     this._init(); 
    } else { 
     return new func(); 
    } 

(PS你”已经有你的代码一个错字,JavaScript是大小写敏感的,所以你应该在最后使用return代替Return

+0

这是真棒!非常感谢你:)我想我会用第二个例子,它更简洁,更易于阅读!感谢您的错字提示 – user2251919 2013-05-13 08:35:43

+0

@ user2251919最后一件事,我只会写'new func();'而不是'new myLib.func();'。通过这样做,代码变得更加便携。例如,如果您决定重命名'myLib',或者重新分配'myLib.func',那么代码仍然会按预期运行。 – 2013-05-13 08:43:21

+0

再次感谢,一个非常好的提示。 – user2251919 2013-05-13 08:48:21

0

如果你并不真正需要的公共/私有方法,你可以使用对象文本

var myLib = {}; 
myLib.func = { 
    _init: function() { 
     this.someVar = 5; 
    }, 
    doSomething: function(a, b) { 
     return a + b; 
    } 
}; 

这将是一个单独的对象,通常这是不够的JavaScript applciation。如果你需要一个对象的很多实例,你将被迫在某处放置一个“新”关键字。

1

如果myLib.func是你的类名,你不能把它像var func = myLib.func();。 但是,你可以包装后一到另一个函数,这样你得到

var factory = function(){ 
    var func = myLib.func(); 
    return func; 
} 
相关问题