javascript之模仿jQuery实现框架雏形

JQuery是如此的强大,所以我决定模仿jQuery造一个轮子,边造轮子边学习jQuery是如何利用各种技巧实现那些非常强大的功能的。既然是模仿jQuery,我决定将新的框架命名为jqc,jQuery copy之意。那么接下来让我们从零实现一个框架的雏形吧,如有谬误有劳告知。

沙箱模式

在一切的开始,我们需要定义一个沙箱来将我们的所有代码放在里面,只留部分接口供外部调用。在沙箱内的所有变量都属于局部变量,不会污染全局变量环境。

(function(window,undefined){
	var jqc = function(){
		//.....
	}
	//.......
	window.jqc = jqc;
})(window)

  

在该自调用函数中有两个形参window和undefined,并传入一个window当做实参。此时在内部使用window对象时直接在函数内部就能查询到window对象,不需要在作用域链中一层一层的往上查找。而由于没有传入第二个参数,所以在函数内使用undefined变量时,值为undefined。这是为了防止低版本浏览器没有undefined关键字,在使用undefined时会因为没有undefined变量而导致浏览器报错。
在最后,将jqc挂在window对象上,对外提供一个接口来操作,而其他变量将被隐藏保护起来。

构造函数

之后,我们需要一个构造函数,用来返回对象。在jQuery中,new jQuery()与jQuery等价。是因为使用了构造函数调用模式的特性,当使用new关键字声明的函数return的是对象时,返回的是return对象。

(function(window,undefined){
	var F = function(){};
	var jqc = function() {
		return new F();
	}
	window.jqc = jqc;
})(window)

  

也就是说在以上代码中,new jqc()和jqc()是等价的。此时和jQuery的效果大致相同了,但是有一点需要注意的是,现在暴露在外的接口仅仅是jqc,而最重要的构造函数F没有对外公开,外界无法修改F,也就无法为jqc写插件。
在jQuery中,将构造函数与jQuery函数联系起来,仅仅需要暴露jQuery就可以对构造函数进行扩展,也就是为jQuery写插件。

var jQuery = function(selector, context) {
	return new jQuery.fn.init(selector, context, rootjQuery);
}
jQuery.fn = jQuery.prototype = {
	init:function(){
		//........
	}
}
jQuery.fn.init.prototype = jQuery.fn;

  

可以看到,在jQuery中,调用jQuery函数将实例化一个init构造函数返回,这里的init就相当于上面我写的F构造函数。jQuery将init构造函数放入jQuery函数的原型中,并且将jQuery的原型对象赋值给init原型对象,这样修改jQuery的原型对象就相当于修改构造函数init的原型对象。所以就可以实现只提供一个接口的前提下对jQuery的原型进行扩展,也就是可以为jQuery实现插件。
而且,源码里还为jQuery函数的原型对象提供了一个简写fn,这样访问原型对象时就不需要写"protoype"这么长的单词,仅仅使用"fn"就可以了。

(function(window,undefined){
	var jqc = function() {
		return new jqc.fn.init();
	}
	jqc.fn = jqc.prototrype = {
		constructor:jqc,
		init:function(){},
		//实例可继承的方法在这里添加
		appendTo:function(){},
		push:function(){},
		each:function(){}
	}
	//为jqc添加方法则可以直接jqc.XXX = function(){}
	jqc.push = function(){};
	jqc.each = function(){};
	jqc.isLikeArr = function(){};
	jqc.isString = function(){};
	jqc.isFunc = function(){};
	jqc.isDom = function(){};

	jqc.fn.init.prototype = jqc.fn;
	window.jqc = jqc;
})(window)

  

修改代码如上后,jqc框架的骨架大致成型。接下来就是不断的添加方法了。但是还缺了点东西,看注释,如果不断的在原型对象里添加方法则会显得十分臃肿,各种功能的方法堆积在一起。为jqc添加方法也是一样,不断的重复写jqc.XXX = function(){}。所以我们需要一个让所有方法分组的办法。

扩展与分模块

来让我们看看jQuery是如何解决上面的问题吧

jQuery.extend = jQuery.fn.extend = function() {
	//实现继承的方法
}

  

在jQuery中为jQuery函数以及jQuery的原型对象实现了一个名为extend的方法,该该方法的作用是将传入的对象所有属性赋值给this。由于extend的算法特别庞大,让我们来实现一个简单的extend方法。

jqc.extend = jqc.fn.extend = function(obj){
	var k;
	for( k in obj){
		this[k] = obj[k];
	}
}

  这样我们就能通过调用jqc.extend为jqc添加新的属性。通过jqc.fn.extend为jqc的原型对象添加方法。现在jqc框架算是初具雏形了,接下来让我们重新组织上面的方法吧。由于JQuery的大部分方法的算法实在是复杂,所以我不打算照搬jQuery的各种方法,牺牲一些兼容性来用简便的方法实现一个大致能用的框架。

(function(window,undefined){

var jqc = function() {
	return new jqc.fn.init();
}
jqc.fn = jqc.prototrype = {
	constructor:jqc,
	length:0,
	//初始化方法
	init:function ( selector , context ){
		var context = context || document;
		//判断传入的是否是  null  ‘‘  undefined  0
		if (!selector) return;
		//判断selector是否是字符串
		if (jqc.isString(selector)) {
			if (selector.charAt(0) === "<") {
				//当为html标签时将调用parseHTML方法获取dom数组
				//将获取到的数组调用pushArr方法添加到自身
				this.push( parseHTML(selector) );
			}else{
				//否则调用select方法获取dom数组
				//将获取到的数组调用pushArr方法添加到自身
				this.push( select(selector,context) );
			}
		//判断selector是否是dom节点
		} else if(jqc.isDom(selector)) {
			//当传入的是dom元素时将dom元素添加到自身
			this.push( [selector] );
		//判断传入的是否是dom数组
		} else if(jqc.isLikeArr(selector) && jqc.isDom(selector[9]) ){
			this.push(selector);
		//判断传入的是否是jqc对象
		} else if( jqc.isJqc(selector) ){
			return this;
		}
	},
	push:function (){}
}

jqc.fn.init.prototype = jqc.fn;

//工具类方法模块
jqc.extend({
	//实现push方法
	push:[].push,
	//循环遍历方法
	each:function (){}
});

//判断类型模块
jqc.extend({
	//判断是否是数组或者伪数组
	isLikeArr:function(obj){},
	isString:function(obj){},
	isFunc:function(obj){},
	//是否是dom对象
	isDom:function(obj){},
	//是否是jqc对象
	isJqc:function(obj){}
});

//dom操作方法
jqc.fn.extend({
	appendTo:function(selector){}
})

//html转换dom对象并返回数组对象
var parseHTML = function(html){}

//查询dom元素并返回数组对象
var select = function ( selector ) {};

window.jqc = jqc;

})(window)

  

以上代码删除了所有方法的方法体,仅仅保留了init构造函数的方法体。通过上面的伪代码就可以看到jqc框架已经大致成型,今后扩展就可以使用extend对jqc或者jqc的原型对象添加新的方法,而且还可以通过不同的extend代码块来对方法按功能分组,而且在沙箱之外,也可以通过extend来为jqc框架添加新的方法来写jqc插件。
jqc框架模拟了jQuery框架的使用方法,如果补全上面的代码,那么可以通过jqc("<div>1</div>").appendTo("body")来创建一个div元素并添加到body下。

时间: 2024-10-13 19:19:24

javascript之模仿jQuery实现框架雏形的相关文章

JavaScript自己模仿jQuery的一点小代码

function seter(sId) {    var obj = document.getElementById(sId);    return new function () {        var objN = obj;        this.html = function (sHtml) {            objN.innerHTML = sHtml;        };    };} 这样的代码有怎样的作用呢? 假如HTML代码中有如下的内容: <div id="S

模仿jquery框架源码---网络

<html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Untitled Page</title> </head> <body> <div id="d">divvv</div> <div id="fsd">fdsf</div> </body> </ht

jQuery异步框架探究1:jQuery._Deferred方法

jQuery异步框架应用于jQuery数据缓存模块.jQuery ajax模块.jQuery事件绑定模块等多个模块,是jQuery的基础功能之一.实际上是jQuery实现的一个异步处理框架,从本质上讲与java aio没有区别,所以需要从更抽象层面的"异步处理"的视角分析解读该模块.这个部分与dom功能关系不大,是独立部分,可以看作是jQuery工具系列之一. 与异步框架相关的方法定义于jQuery类的静态方法中.只有三个方法,但是功能和应用及其强大!本篇详细讲解第一个方法jQuery

JQuery EasyUI框架学习

前言 新项目的开发前端技术打算采用EasyUI框架(基于EasyUI较为丰富的UI组件库),项目组长将前端EasyUI这块的任务分配给了我.在进行开发之前,需要我这菜鸟对EasyUI框架进行一些基础的入门学习.之后会在学习的过程中将自己遇到的问题和有用的东西记录下来. 关于EasyUI EasyUI框架式基于JQuery的,使用它帮助我们快捷的构建web网页.EasyUI框架是一个简单.易用.强大的轻量级web前端javascript框架.现阶段来说,在开发web项目时,前端的开发我们更喜欢使用

【转】推荐10款最热门jQuery UI框架

推荐10款最热门jQuery UI框架 原创 在进行Web开发时,并非所有的库都适合你的项目,但你仍需要收藏一些Web UI设计相关的库或框架,以在你需要的时候,加快你的开发效率.本文为你推荐10款非常优秀的基于JQuery的Web UI设计框架 1.国产jQuery UI框架 (jUI) DWZ DWZ富客户端框架(jQuery RIA framework), 是中国人自己开发的基于jQuery实现的Ajax RIA开源框架. 设计目标是简单实用,快速开发,降低ajax开发成本. 欢迎大家提出

你应该了解的jquery 验证框架

Jquery validate 验证 具体查看附件中demo 主要是几种使用形式: 1.写在js中: $("#signupForm").validate({ rules: { firstname: "required", lastname: "required", }, messages: { firstname: "Please enter your firstname", lastname: "Please en

jQuery ui 框架

jQuery ui框架很多,除了官方提供的jquery UI(如果你还不知道什么是jQuery UI,请看下载了jquery ui后如何使用),还有很多第三方提供的ui框架,因官方提供的jquery ui框架体积较大,所以很多人都不喜欢用,但不论是官方提供还是第三方提供,他们都是基于jquery核心类库实现的ui框架.    1.jQuery Smart UI 官网地址http://smartui.chinamzz.com JQuery Smart UI是基于JQuery的Ajax开发的一个jq

Ajax学习(二):模仿jQuery的Ajax封装工具

通过上一节的学习,基本了解Ajax的使用, 但是这样使用很麻烦,这里封装ajax为一个方法,作为一个ajax工具,传入相应参数就可以实现ajax的使用. 模仿jQuery的Ajax. 如下是jQuery的Ajax使用,只需要传入相应参数,即可实现Ajax 第一步:创建Ajax工具类: function createXMLRequst(){ try{ return new XMLHttpRequest(); }catch(e) { try{ return new ActiveXObject("Ms

JavaScript强化教程——jQuery选择器

本文为 H5EDU 机构官方 HTML5培训 教程,主要介绍:JavaScript强化教程 -- jQuery选择器 jQuery 选择器 选择器 实例 选取 * $("*") 所有元素 #id $("#lastname") id="lastname" 的元素 .class $(".intro") 所有 class="intro" 的元素 element $("p") 所有 <p&