关于jquery:从JQuery出发总结的关于原型使用上的一些浅薄理解

50次阅读

共计 1072 个字符,预计需要花费 3 分钟才能阅读完成。

比方咱们当初的需要如下。

有一个函数 MyObj,反对如下性能:

  • 能够通过 MyObj()的形式返回一个对象,这个对象和 new MyObj()是等价的
  • MyObj 自身是一个对象,能够通过 MyObj.doit()的形式调用其上的办法或属性
    为了实现需求,第一反馈是:

    var MyObj=function(){return new MyObj();
    };

    而后在 MyObj 上挂载静态方法,在 MyObj.prototype 上挂载对象办法。

看起来稳的很,其实这显著是一个死循环:

// VM160:2 Uncaught RangeError: Maximum call stack size exceeded
MyObj();

为了解决这个问题,咱们在 MyObj 的原型上定义了一个办法:

MyObj.prototype.init=function(){return this;};

执行上面的办法:

var temp=MyObj.prototype.init();

下面返回的 temp 很显著就是 MyObj.prototype,其实就是 MyObj 对象(例如:new A(),其实就是取 A.prototype,这样比照就很好了解了)。

因而能够革新代码如下:

var MyObj = function (param) {return MyObj.prototype.init();
};

这样 MyObj 和 new MyObj()就别离示意类和对象。

问:看起来是不是实现了?答:是的,实现了。问:可是总感觉有点不好,说不出为什么。答:是不是感觉 MyObj()打印进去的货色有点多?问:是的。

事实上,因为间接取 MyObj.prototype 作为 new MyObj(),实践上说,应用上区别不大,惟一有余的是,挂载在 MyObj.prototype 上的办法会在打印 MyObj 对象的时候看见,不难受。

为了看起来难看些,代码再次革新:

var MyObj = function () {return new MyObj.prototype.init();
};

// 为了让 MyObj()返回的是 MyObj 对象,须要批改 MyObj.prototype.init 的原型
MyObj.prototype.init.prototype = MyObj.prototype;

此刻的原型关系变成了:

MyObj() ==
return new MyObj.prototype.init() ==
MyObj.prototype.init.prototype ==
MyObj.prototype ==
new MyObj()

此时需要就实现了,而且打印 MyObj()的时候,对象上的办法都在原型上,看起来就比拟难受了。

正文完
 0