JavaScript 原型的实际应用之实现一个 jQuery
我们平时使用jQuery大概是这样:
let $p = $('p');
$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
// my-jquery.js
(function(window) {
var jQuery = function (selector) {
// 通过new关键字,找到构造函数
return new jQuery.fn.init(selector);
};
// 初始化 jQuery.fn
jQuery.fn = jQuery.prototype = {
constructor: jQuery,
css: function(key, value) {
let that = this;
for (var i = 0; i < that.length; i++) {
that[i].style[key] = value;
}
},
html: function (value) {
return this[0].innerHTML;
},
};
// 定义构造函数
var init = jQuery.fn.init = function(selector) {
var slice = Array.prototype.slice;
var dom = slice.call(document.querySelectorAll(selector));
var i,
len = dom ? dom.length : 0;
for (i = 0; i < len; i++) {
this[i] = dom[i];
}
this.length = len;
this.selector = selector || '';
};
// 定义原型
init.prototype = jQuery.fn;
window.$ = jQuery;
})(window);
这里有个问题:这里为什么不直接把init.prototype赋值为一个对象,而是要通过jQuery.fn做中转呢?
jQuery.fn = {...};
init.prototype = jQuery.fn;
这就体现了原型的扩展性,jQuery.fn | $.fn 是用来扩展插件用的,将插件扩展统一到$.fn.xxx 这一个接口,也是符合对修改封闭,对扩展开放的原则。
下面我们来写一个简单的jQuery插件。
$.fn.getNodeName = function () {
return this[0].nodeName;
}
// 测试
alert($box.getNodeName()); // DIV
小结:
本篇文章总结了以下几个问题
- jQuery是如何使用原型的?
- 如何实现一个小型的jQuery?
- jQuery的插件扩展机制
JavaScript 原型的实际应用之实现一个 jQuery的更多相关文章
- JavaScript原型与原型链,原型的实际应用
原型链是js面向对象的基础,非常重要. 一,创建对象的几种方法: 1,字面量 var o1 = { name:'o1' }; 2,构造函数 var M = function(name){ this.n ...
- 简单粗暴地理解 JavaScript 原型链 (一个充满歪门邪理的理解方法,有助于新手哦!)
原型链理解起来有点绕了,网上资料也是很多,每次晚上睡不着的时候总喜欢在网上找点原型链和闭包的文章看,效果极好. 不要纠结于那一堆术语了,那除了让你脑筋拧成麻花,真的不能帮你什么.简单粗暴点看原型链吧, ...
- 浅谈系列之 javascript原型与对象
在我学习与使用javascript三个月中,我一直对javascript的继承关系以及prototype理解不清,导致很多时候为什么这么用说不出个所以然来.截止到本周为止,通过之前的学习以及自己的再学 ...
- JavaScript原型OOP——你上车了吗?
.title-bar { width: 80%; height: 35px; padding-left: 35px; color: white; line-height: 35px; font-siz ...
- JavaScript - 原型
一切皆为对象 殊不知,JavaScript的世界中的对象,追根溯源来自于一个 null 「一切皆为对象」,这句着实是一手好营销,易记,易上口,印象深刻. 万物初生时,一个null对象,凭空而生,接着O ...
- 深入理解javascript原型和闭包(1)——一切都是对象
“一切都是对象”这句话的重点在于如何去理解“对象”这个概念. ——当然,也不是所有的都是对象,值类型就不是对象. 首先咱们还是先看看javascript中一个常用的函数——typeof().typeo ...
- 深入理解javascript原型和闭包(2)——函数和对象的关系
上文(理解javascript原型和作用域系列(1)——一切都是对象)已经提到,函数就是对象的一种,因为通过instanceof函数可以判断. var fn = function () { }; co ...
- 深入理解javascript原型和闭包(3)——prototype原型
既typeof之后的另一位老朋友! prototype也是我们的老朋友,即使不了解的人,也应该都听过它的大名.如果它还是您的新朋友,我估计您也是javascript的新朋友. 在咱们的第一节(深入理解 ...
- 深入理解javascript原型和闭包(4)——隐式原型
注意:本文不是javascript基础教程,如果你没有接触过原型的基本知识,应该先去了解一下,推荐看<javascript高级程序设计(第三版)>第6章:面向对象的程序设计. 上节已经提到 ...
随机推荐
- Java异步编程第2篇
假如如今有一个Buttonbutton,Buttonbutton上有click和doubleclick事件. 两个不同的事件须要进行不同的处理.这时候就须要为对应的事件注冊Listener了.改动后的 ...
- Mac环境,React native错误解决方案
运行react-native run-android,报错如下图: 运行react-native run-ios正常,但 react-native run-android时,提示错误: 在网上 ...
- Map总结--HashMap/HashTable/TreeMap/WeakHashMap使用场景分析(转)
首先看下Map的框架图 1.Map概述 1.Map是键值对映射的抽象接口 2.AbstractMap实现了Map中绝大部分的函数接口,它减少了“Map实现类”的重复编码 3.SortedMap有序的“ ...
- Spring自定义配置--ConfigurationProperties
自定义配置的变量名: 在 *.properties 里面定义特定的变量 server.port=9000 amazon.associateId=habuma-20 建立Properties文件制定特定 ...
- Linux-3.14.12内存管理笔记【kmalloc与kfree实现】【转】
本文转载自:http://blog.chinaunix.net/uid-26859697-id-5573776.html kmalloc()是基于slab/slob/slub分配分配算法上实现的,不少 ...
- sublime 3好用快捷键
sublime 3好用快捷键 自己常用 删除行 [ { "keys": ["ctrl+shift+d"], "command": " ...
- 分享知识-快乐自己:Struts2框架 工作原理及执行流程图(拦截器的使用)
Struts2 架构图: 1):提交请求 客户端通过 HttpServletRequest 向 Servlet (即Tomcat)提交一个请求. 请求经过一系列的过滤器,例如图中的 ActionCon ...
- 分布式锁的实现方式——ACID数据库、缓存或者是zk
针对分布式锁的实现,目前比较常用的有以下几种方案: 基于数据库实现分布式锁 基于缓存(redis,memcached,tair)实现分布式锁 基于Zookeeper实现分布式锁 在分析这几种实现方案之 ...
- Linux_异常_02_WinSCP上传文件时显示Permission denied
异常现象如下: 二.解决方案 1.设置对应目录权限全开,就可以上传文件到这个目录了 sudo chmod 777 /devloper
- win32com操作word(1):几个重要的对象(28.35)
Pywin32模块为python封装了操作windows底层API函数的功能.而win32com是Pywin32下面的一个模块,专门负责操作com组件. 由于office工具(Word.Excel等) ...