【问题标题】:javascript : make a new safe class constructorjavascript:创建一个新的安全类构造函数
【发布时间】:2011-05-30 16:11:26
【问题描述】:

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

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

有没有可能,有模块吗?

【问题讨论】:

    标签: javascript oop node.js


    【解决方案1】:

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

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

    我希望这会有所帮助!

    【讨论】:

      【解决方案2】:

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

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

      要了解您的函数是否作为构造函数被调用,请使用instanceof

      function Foo() {
          console.log(this instanceof Foo);
      }
      
      Foo();  // false
      new Foo(); // true
      

      当作为构造函数调用函数时,this 指的是新创建的对象,否则this 指的是调用该函数的对象,如果没有调用任何对象,this 将指的是全局对象。

      更新

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

      你可以做两件事:

      1. 不要从您的类工厂方法返回 Class 函数本身,而是返回一个创建新实例、设置所有需要的东西然后返回该实例的函数(这会使继承变得更加复杂)
      2. 只需使用new 关键字即可。

      我已经编写了自己的Class thingy,并尝试同时支持new() 语法来创建实例。整个继承之类的东西已经够复杂了,只是为了节省更多4个字符就更神奇了……不值得努力。使用new 并编写测试。

      另一个更新

      好吧,我无法抗拒更多的破解,我成功了:

      function is(type, obj) {
          return Object.prototype.toString.call(obj).slice(8, -1) === type;
      }
      
      function clas(args) {
          if (is('Object', this)) {
              ctor.apply(this, is('Arguments', args) ? args : arguments);
      
          } else {
              return new clas(arguments);
          }
      }
      

      至少在我的情况下,这会产生魔力。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-24
        • 2018-05-05
        相关资源
        最近更新 更多