我们要给一个对象(var和函数)定义原始对象时,有两种定义方法
var a=function(){
getName:function(){}
}
a.prototype=function(){
getName:function(){}
}
或
function b(){}
b.prototype=funtion(){}
这两种写法在调用原始对象方法时有所不同。
第一种:a.prototype.getName();
第二种:new b().getName();
当然我们不想经常new一个对象出来,但也不想每次都带着prototype调用。
怎么办呢?
看下面的例子,就是返回prototype对象。。
var DomLoader=function(window){
var DomLoader=function (){};
DomLoader.prototype={
createNode:function(){
alert(1);
this.getName();
},
getName:function(){
alert(arguments.callee.caller==this.createNode);//true
}
};
return DomLoader.prototype;
}();
DomLoader.createNode();
在博客上见另外一种实现方法
(function(){
var DomLoader=(function(){
//这里的DomLoader毫无意义,因为这里DomLoader在外面是访问不到的(所以下面提供了一个简洁的实现方法)
//注意这里的init还没有定义,这里函数没有调用,所以不会报错,如果在下面调用:DomLoader();,
//程序就会报错,因为函数未定义。。
var DomLoader=function (){return new DomLoader.prototype.init();};
//这正是实现了不用ne的关键。。所以,调用DomLoader(),后返回的是个函数new化的对象。上面第二种的调用方式
DomLoader.prototype={
createNode:function(){
alert(1);
this.getName();
},
getName:function(){
alert(arguments.callee.caller==this.createNode);
},
init:function(){}
};
DomLoader.prototype.init.prototype = DomLoader.prototype;
//让init的原型对象指向DomLoader的原型对象然后返回
return window.DomLoader =DomLoader;//这里是传值给window的属性
//alert(DomLoader);
//alert( DomLoader.prototype.init);
//return DomLoader.prototype;
})();
})(window);
alert(DomLoader);//打印出来的其实是init函数
DomLoader().createNode();//这里一定要加(),才能执行init函数,返回对象。使用prototype对象方法
其实就是吧DomLoader编程了init函数对象,返回后就可直接调用,不用new。
注意上面代码标红的部分
简洁的实现方法:
var DomLoader=(function(){
var DomLoader=function (){return new DomLoader.prototype.init();};
DomLoader.prototype={
createNode:function(){
alert(1);
this.getName();
},
getName:function(){
alert(arguments.callee.caller==this.createNode);
},
init:function(){}
};
DomLoader.prototype.init.prototype = DomLoader.prototype;
return DomLoader;
//alert(DomLoader);
//alert( DomLoader.prototype.init);
//return DomLoader.prototype;
})();
alert(DomLoader);
DomLoader().createNode();
不使用window对象