使用定义Prototype的对象或函数
我们要给一个对象(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对象