我们平时使用jQuery大概是这样:

  1. let $p = $('p');
  2. $p.css('fontSize', '40px');

我们生成jQuery实例对象后,就可以使用原型上的css(), html()等方法,这就体现了原型继承:由构造函数生成的实例对象,可以继承构造函数的原型对象上的属性和方法。

我们可以试着手写一个迷你的jQuery,思路大概是这样:

1-通过匿名自执行函数来存放我们的代码,将window对象作为参数传入,防止全局作用域的污染。

2-利用工厂函数,在调用jQuery或者$的时候,返回构造函数的实例对象

3-构造函数定义为jQuery.fn.init,初始化时处理dom元素,将dom元素绑定在实例对象上

4-将构造函数的prototype属性指向jQuery.fn,此时构造函数的实例便可以继承jQuery.fn里的属性和方法

5-jQuery.fn是一个对象,里面存放了所有的jQuery方法,让外部来调用

代码实现:

完整代码请查看 my-jquery

  1. // my-jquery.js
  2. (function(window) {
  3. var jQuery = function (selector) {
  4. // 通过new关键字,找到构造函数
  5. return new jQuery.fn.init(selector);
  6. };
  7. // 初始化 jQuery.fn
  8. jQuery.fn = jQuery.prototype = {
  9. constructor: jQuery,
  10. css: function(key, value) {
  11. let that = this;
  12. for (var i = 0; i < that.length; i++) {
  13. that[i].style[key] = value;
  14. }
  15. },
  16. html: function (value) {
  17. return this[0].innerHTML;
  18. },
  19. };
  20. // 定义构造函数
  21. var init = jQuery.fn.init = function(selector) {
  22. var slice = Array.prototype.slice;
  23. var dom = slice.call(document.querySelectorAll(selector));
  24. var i,
  25. len = dom ? dom.length : 0;
  26. for (i = 0; i < len; i++) {
  27. this[i] = dom[i];
  28. }
  29. this.length = len;
  30. this.selector = selector || '';
  31. };
  32. // 定义原型
  33. init.prototype = jQuery.fn;
  34. window.$ = jQuery;
  35. })(window);

这里有个问题:这里为什么不直接把init.prototype赋值为一个对象,而是要通过jQuery.fn做中转呢?

  1. jQuery.fn = {...};
  2. init.prototype = jQuery.fn;

这就体现了原型的扩展性,jQuery.fn | $.fn 是用来扩展插件用的,将插件扩展统一到$.fn.xxx 这一个接口,也是符合对修改封闭,对扩展开放的原则。

下面我们来写一个简单的jQuery插件。

  1. $.fn.getNodeName = function () {
  2. return this[0].nodeName;
  3. }
  4. // 测试
  5. alert($box.getNodeName()); // DIV

小结:

本篇文章总结了以下几个问题

  • jQuery是如何使用原型的?
  • 如何实现一个小型的jQuery?
  • jQuery的插件扩展机制

JavaScript 原型的实际应用之实现一个 jQuery的更多相关文章

  1. JavaScript原型与原型链,原型的实际应用

    原型链是js面向对象的基础,非常重要. 一,创建对象的几种方法: 1,字面量 var o1 = { name:'o1' }; 2,构造函数 var M = function(name){ this.n ...

  2. 简单粗暴地理解 JavaScript 原型链 (一个充满歪门邪理的理解方法,有助于新手哦!)

    原型链理解起来有点绕了,网上资料也是很多,每次晚上睡不着的时候总喜欢在网上找点原型链和闭包的文章看,效果极好. 不要纠结于那一堆术语了,那除了让你脑筋拧成麻花,真的不能帮你什么.简单粗暴点看原型链吧, ...

  3. 浅谈系列之 javascript原型与对象

    在我学习与使用javascript三个月中,我一直对javascript的继承关系以及prototype理解不清,导致很多时候为什么这么用说不出个所以然来.截止到本周为止,通过之前的学习以及自己的再学 ...

  4. JavaScript原型OOP——你上车了吗?

    .title-bar { width: 80%; height: 35px; padding-left: 35px; color: white; line-height: 35px; font-siz ...

  5. JavaScript - 原型

    一切皆为对象 殊不知,JavaScript的世界中的对象,追根溯源来自于一个 null 「一切皆为对象」,这句着实是一手好营销,易记,易上口,印象深刻. 万物初生时,一个null对象,凭空而生,接着O ...

  6. 深入理解javascript原型和闭包(1)——一切都是对象

    “一切都是对象”这句话的重点在于如何去理解“对象”这个概念. ——当然,也不是所有的都是对象,值类型就不是对象. 首先咱们还是先看看javascript中一个常用的函数——typeof().typeo ...

  7. 深入理解javascript原型和闭包(2)——函数和对象的关系

    上文(理解javascript原型和作用域系列(1)——一切都是对象)已经提到,函数就是对象的一种,因为通过instanceof函数可以判断. var fn = function () { }; co ...

  8. 深入理解javascript原型和闭包(3)——prototype原型

    既typeof之后的另一位老朋友! prototype也是我们的老朋友,即使不了解的人,也应该都听过它的大名.如果它还是您的新朋友,我估计您也是javascript的新朋友. 在咱们的第一节(深入理解 ...

  9. 深入理解javascript原型和闭包(4)——隐式原型

    注意:本文不是javascript基础教程,如果你没有接触过原型的基本知识,应该先去了解一下,推荐看<javascript高级程序设计(第三版)>第6章:面向对象的程序设计. 上节已经提到 ...

随机推荐

  1. MaLoc: a practical magnetic fingerprinting approach to indoor localization using smartphones

    https://www.indooratlas.com/ MaLoc: a practical magnetic fingerprinting approach to indoor localizat ...

  2. centos设置固定IP方法

    首先网络模式设为桥接 [root@centos64 ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0HWADDR=00:0C:2 ...

  3. 特殊例子--JavaScript代码实现图片循环滚动效果

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. 网页布局的应用(float或absolute)

    一个浮动(左浮动或右浮动) 垂直环绕布局(float.clear) 左右两列布局(float.absolute) 三栏网页宽度自适应布局(float.absolute) 注意:网页设计中应该尽量避免使 ...

  5. iOS开发中集成Reveal

    [转]http://blog.devzeng.com/blog/ios-reveal-integrating.html 配置方式一简介有效. Reveal 是一个界面调试工具.使用Reveal,我们可 ...

  6. struts2 codebehind + actionPackages 实现Action零配置

    1.jar包:struts2-codebehind-plugin-2.2.1.1.jar 2.struts.xml:<!-- codebehind中查找action的返回结果资源时的默认文件夹 ...

  7. HDU3336 Count the string —— KMP next数组

    题目链接:https://vjudge.net/problem/HDU-3336 Count the string Time Limit: 2000/1000 MS (Java/Others)     ...

  8. 使用pip安装第三方库报错记录

    今天在使用pycharm导入第三方库的时候,报了好多超时错误,还有标题中的找不到版本,应该是网络的原因,记录下解决的办法: raise ReadTimeoutError(self._pool, Non ...

  9. Spring Boot2.0之整合JSP

    首先不建议整合JSP哈,spring boot 对jsp的支持力度不大.  内置tomcat不支持jsp. 注意:在创建项目时候一定是war类型的,而不是跟之前那个freemarker那种jar类型. ...

  10. ffmpeg 调试

    --enable-debug=3 --disable-optimizations --disable-yasm --disable-asm