Javascript里的创建类的实例的模式

如果有这样一个类M

function M(a,b)
{
   
this.n=a*10+b;
}

调用代码:

var n=1;
var result=M(n, 1);
console.log(n);
console.log(result.n);

能看到两个地方的问题:

  1. n=11,不再等于1了
  2. result is undefined

虽然调用都是new M()的方式,但是这样显得麻烦. 参考了John的方法

function M(a,b)
{
   
if(this instanceof M)
       
this.n=a*10+b;
   
else
       
return new M(a,b);
}

这样var result=M(n,1)后n=1, result.n=11. 是我们想要的结果了.

so,创建一个用户创建对象的pattern:

function makeClass()
{
   
return function(args)
   
{
        
if(this instanceof arguments.callee)
       
{
           
if(typeof this.init == 'function')
               
this.init.apply(this, args.callee ? args : arguments);
       
}
       
else
           
return new arguments.callee(arguments);
   
};
}

这样我们就可以这样来定义class:

var MM=makeClass();
MM.prototype.init=function(a, b)
{
   
this.n=a*10+b;
};
 
看结果:
var n=1;
var result=MM(n, 1);
console.log(n);
console.log(result.n);
 
----
 
如果不太清楚执行的过程,我们可以debug进去看看,改造一下makeClass函数:
 
function makeClass()
{
//    return function(args)  <-- 在这里打breakpoint在firebug里跟踪不进去
    var a=return function(args) <--所以改成var ..的形式就可以了

   
{
       
if(this instanceof arguments.callee)
       
{
           
if(typeof this.init == 'function')
               
this.init.apply(this, args.callee ? args : arguments);
       
}
       
else
           
return new arguments.callee(arguments);
   
};
    
return a;
}
 
如果debugger;不好用, 可以用firebug的consolecommand来调试进去看过程
posted @ 2008-07-13 18:21  new 维生素C.net()  阅读(622)  评论(0编辑  收藏  举报