首先,如果这是一个愚蠢的问题,我很抱歉.我已经写了两个代码片段.从找到的第一个代码片段在这里写的John Resig
,毫无疑问他的最好成绩之一和第二代码片段是由我从原始代码修改只能理解上的差异,但我不知道其实是什么都和我之间的差异可以而且不能与两者相比.请有人帮我理解差异.谢谢.
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 );
};
}
var User = makeClass();
User.prototype.init = function(first, last){
this.name = first + " " + last;
};
var user = User("John", "Resig");
console.log(user);
Run Code Online (Sandbox Code Playgroud)
修改版
function myClass(args)
{
if (this instanceof arguments.callee)
{
this.init = function(first, last){
this.name = first + " " + last;
};
this.init.apply( this, args.callee ? args : arguments );
}
else return new arguments.callee( arguments );
}
var obj = new myClass('Sheikh', 'Heera');
console.log(obj);
Run Code Online (Sandbox Code Playgroud)
为什么我应该使用对象的原型来添加方法(在创建实例之后)而不是在构造函数中写入它?
一个主要的原因,以限定在对象的原型,而不是在构造一个方法是,在原型中定义的方法是立即可用的,并通过共享的(在存储器中)的对象的所有实例.
通过在构造函数中定义方法,该方法特定于创建它的对象的实例.如果您insantiate对象的10,你有10个拷贝的方法,在内存中,即使他们都是一样的,直到你修改其中的一个.
但是要清楚,通过在对象实例之间共享,我并不是说该方法在它访问的任何属性上静态运行.这些属性(如果定义this.
)仍然是特定于实例的.只是你不会最终定义同一方法的多个副本.