Javascript里的创建类的实例的模式
如果有这样一个类M
function M(a,b)
{
this.n=a*10+b;
}
{
this.n=a*10+b;
}
调用代码:
var n=1;
var result=M(n, 1);
console.log(n);
console.log(result.n);
var result=M(n, 1);
console.log(n);
console.log(result.n);
能看到两个地方的问题:
- n=11,不再等于1了
- 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);
}
{
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);
};
}
{
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;
};
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);
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;
}
{
// 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;
}