在javascript中将全局函数转换为静态实用程序

时间:2014-03-07 05:56:55

标签: javascript

我有一个Shape类,它在全局范围内定义:

function Shape(t) {
   this.type;                            
   Shape.prototype.init = function(){
      this.type = t;
      //more work here             
   }
   this.init();                                         
}  

我想将所有全局函数/类合并到一个类中,以避免与全局命名空间冲突

function Util(){}
Util.Shape = function(){...}
Util.Point = function(){...}

这样可行,但我不喜欢每次都重复Util.,所以我使用像命名空间这样的属性来处理相关函数,在这种情况下,math:

Util.math = {
   Shape: function(t) {
      this.type;                            
      Shape.prototype.init = function(){
         this.type = t; 
         //more work here            
      }
      this.init();                                         
   },
   Point: function(t) {...}
}       

但这不起作用;抱怨this.init();这是有道理的,因为这里不需要Shape.prototype,所以它被删除了:

Util.math = {
   Shape: function(t) {
      this.type;                            
      this.init = function(){
         this.type = t;             
      }
      this.init();                                         
   }
}

立即行动:

var square = new Util.math.Shape('square');
var circle = new Util.math.Shape('circle');         
console.log(square.type);  // 'square'
console.log(circle.type);  // 'circle'

问题:
这种方法有什么问题吗?更有效/更清洁的方式吗?

另外,为什么这不起作用?(这是coolness

Util.math = {
   Shape: function(t) {
      this.type;                            
      this.init = function(){
         this.type = t;             
      }                                         
   }.init(); //<------coolness
}

1 个答案:

答案 0 :(得分:0)

你也可以这样做:

var myLib = (function() {

  var obj = {};

  function Shape(t) {
    this.init(t);
  }

  Shape.prototype.init = function(t){
     this.type = t;
  }

  obj.Shape = Shape;

  // more stuff

  return obj;
}());

var shape = new myLib.Shape('circle');

console.log(shape.type); // circle

假设 init 只是一个例子。