javascript:创建一个新的安全类构造函数

时间:2010-12-25 16:58:24

标签: javascript oop node.js

有时我们在定义新对象时会丢失新关键字

obj = new Clazz(); //correct
obj = Clazz(); //wrong, but no syntax error, hard to debug.

我想编写一个函数来帮助我创建Class并使其更安全。

var Class = function(){
   var constructor = arguments[0];
   var superClasses = arguments[1..n];
   function clazz(){
     if(! this instanceof clazz){
         return new clazz()//pass clazz arguments,not Class arguments
     }
     constructor();//pass clazz arguments
   }

   //clazz inherit from superClasses 

   return clazz;
}

var MyClazz = Class(function(name){
    this.name = name
}, SuperClazz1, SuperClass2 )

MyClazz.extend({
    show: function(){console.log(this.name)}
})

obj1 = new MyClazz("name1"); 
obj2 = MyClazz("name2");
// obj1 should same as obj2

是否可以,任何存在的模块?

2 个答案:

答案 0 :(得分:3)

  

有时我们会丢失新关键字...

所有关于编码规则和测试...无论如何,继续你的问题。

要确定您的函数是否作为构造函数调用,请使用instanceof

function Foo() {
    console.log(this instanceof Foo);
}

Foo();  // false
new Foo(); // true

当一个函数作为构造函数调用时this引用新创建的对象,否则this引用该函数被调用的对象,以防它没有被调用{{1将引用全局对象。

<强>更新

无法将变量参数传递给构造函数。 this会产生new clas.call(....)不是构造函数的错误。

你可以做两件事:

  1. 不是从类工厂方法返回call函数本身,而是返回一个创建新实例的函数,设置所有需要的东西,然后返回该实例(这将使继承变得更加复杂)< / LI>
  2. 只需使用Class关键字。
  3. 我已经编写了自己的Class thingy,并且我尝试同时支持newnew语法来创建实例。整个继承的东西等都足够复杂,只是为了节省 4 更多的角色更加神奇......不值得努力。使用()并编写测试。

    另一次更新

    好吧,我无法抗拒更多的攻击,我让它成功了:

    new

    至少在我的情况下,这将起到魔力。

答案 1 :(得分:1)

很抱歉这个答案迟交,但我相信它会直接回答你的问题。我的解决方案是检查构造对象的类型并采取相应的行动。

您可以在此处查看我的解决方案: http://mikepackdev.com/blog_posts/9-new-scope-safe-constructors-in-oo-javascript

我希望这有帮助!