欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

jQuery中创建实例与原型继承揭秘

程序员文章站 2023-11-14 11:11:28
如 new object()、new date()等等!(object有{},数组有[]这样的快捷方式 ,我们主要探讨new这种方式。) 我们在使用jquery时从来没有使用过new,他是不是用其...

如 new object()、new date()等等!(object有{},数组有[]这样的快捷方式 ,我们主要探讨new这种方式。)

我们在使用jquery时从来没有使用过new,他是不是用其他方法来生成实例呢?是不是没有使用prototype属性呢?事实上他都有使用,只是内部处理的非常巧妙,提高了使用的爽快度。我们来看看他的。

代码如下:


funtion jquery( selector, context){
  return new jquery.fn.init( selector, context );
}


这里可以看出jquery是有构造函数的,也是用了new 创建实例的。那么jquery.fn是什么呢?后面有个这样的处理:

代码如下:


jquery.fn = jquery.prototype={
init:function (){}
}


这样我们就明白了,jquery的构造函数是他原型上的init方法,而不是function jquery。这样的话每次调用$()他都会用jquery原型上的init创建一个实例,那么新的问题来了。如果用init创建实例的话,这个对象继承的是init的prototype上的方法而不会继承jquery prototype上的方法,那么他是怎么实现原型继承的呢?

jquery.fn.init.prototype = jquery.fn;
这里他有一个这样的处理,把jquery.fn赋值给了jquery.fn.init.prototype ,这一步很关键。我门看看这些是什么。

jquery.fn是jquery.prototype

jquery.fn.init.prototype是jquery.prototype.init.prototype

这个处理相当于

jquery.prototype = jquery.prototype.init.prototype

那么每当我们调用$()是,jquery就会用new运算符调用他prototype上的init创建一个实例,这个由init创建实例会继承jquery protype上的所有方法,并且这个实例的__proto__内部属性会指向jquery的prototype属性。

另外我们注意到这个处理:

jquery.fn = jquery.prototype

这是他为了避免频繁的操作jquery.prototype,所以用jquery.fn缓存了jquery.prototype。

这些的处理实在是非常巧妙,内部处理了实例创建不用使用者用new去生成实例,又非常漂亮的处理了prototype保证多实例共享方法减少资源开支。