当前位置: 首页 > Web前端 > HTML

从JQuery中总结的关于原型使用的一些浅层理解

时间:2023-03-28 18:06:07 HTML

例如我们目前的需求如下。有一个函数MyObj,支持以下功能:可以通过MyObj()返回一个对象,相当于newMyObj()。MyObj本身就是一个对象,可以通过MyObj.doit()来调用它来实现方法或属性的要求,第一反应是:varMyObj=function(){returnnewMyObj();};然后在MyObj上挂载静态方法,在MyObj.prototype上挂载对象方法。看起来很稳定,但明显是死循环://VM160:2UncaughtRangeError:MaximumcallstacksizeexceededMyObj();为了解决这个问题,我们在MyObj的原型上定义了一个方法:MyObj.prototype。init=function(){返回这个;};执行以下方法:vartemp=MyObj.prototype.init();上面返回的temp很明显是MyObj.prototype,其实就是MyObj对象(比如:newA(),其实就是取A.prototype,这样比较好理解)。因此,代码可以修改为:varMyObj=function(param){returnMyObj.prototype.init();};这样MyObj和newMyObj()分别代表类和对象。Q:看起来像真的吗?答:是的,确实如此。Q:但是我总感觉有点不好,说不上来为什么。答:是不是觉得MyObj()打印的东西太多了?问:是的。其实因为MyObj.prototype是直接作为newMyObj()来使用的,理论上在使用上并没有太大区别。唯一的缺点就是在打印MyObj对象的时候会看到挂载在MyObj.prototype上的方法,很不舒服。为了更好看,再次修改代码:varMyObj=function(){returnnewMyObj.prototype.init();};//为了让MyObj()返回MyObj对象,需要修改MyObj.prototype.init原型MyObj.prototype.init.prototype=MyObj.prototype;此时的原型关系变为:MyObj()==returnnewMyObj.prototype.init()==MyObj.prototype.init.prototype==MyObj.prototype==newMyObj()此时需求满足,并且在打印MyObj()的时候,对象上的方法都在原型上,看起来更舒服。