jquery学习笔记之无new构建详解


Posted in jQuery onDecember 07, 2017

前言

当我们想要创建一个对象,我们可能使用new方法去构建一个对象,那按道理jquery也是一个对象,应该也是用new jquery()来构建呀为什么我们创建jquery对象不用new jquery()而是直接使用类似$(ele)的方式去构建出来一个jquery对象呢?其实内部还是使用了new来构建的,只是jquery内部帮我们构建了而已,请看下面代码

function Jquery(selector, context) {
  return new Jquery(selector, context);
 }

 Jquery.prototype = {
  version:'1.01'
 }

直接这样内部使用new来构建Jquery,很明显是有问题的,这样的话就形成了死循环。为了解决死循环的问题,请看下面代码:

function Jquery(selector, context) {
 return Jquery.prototype.init(selector, context);
}

Jquery.prototype = {
 version:'1.01',
 init: function () {
  this.name = "lin";
  return this;
 }
}

var a = Jquery();
var b = Jquery();
console.log(a.version); //1.01
console.log(a.name); //lin
a.name = "na";
console.log(b.name); //na

死循环的问题确实解决了,但是又发现了新的问题,可以看到a和b两个对象的属性是公用的,我修改a.name属性为na,b.name属性也跟着变为了na,其原因就是this都是指向Jquery的

为了解决这个问题,我们可以每次调用Jquery()的时候都构建一个新的对象,改进代码如下:

function Jquery(selector, context) {
 return new Jquery.prototype.init(selector, context); //注意看,这里多了个new
}

Jquery.prototype = {
 version:'1.01',
 init: function () {
  this.name = "lin";
  console.log(this);
  return this;
 }
}

var a = Jquery();
var b = Jquery();
console.log(a.version); //undefined
console.log(a.name); //lin
a.name = "na";
console.log(b.name); //na

这样处理之后,属性共享的问题已经解决了,每个对象都有各自的属性,可以自由修改,每个对象互不影响,但是又又又发现了新的问题,可以看到我们控制台打印a.version这个属性的时候是读取不到这个属性的,原因就在于此时Jquery.prototypeJquery.prototype.init.prototype是互不相干的,我们创建的是Jquery.prototype.init对象,所以只能读到Jquery.prototype.init.prototype上的属性而读取不到Jquery.prototype上的属性的(该例指version这个属性),解决办法很简单,就是把Jquery.prototype赋值给Jquery.prototype.init.prototype,这样就相当于把Jquery原型上的属性全部赋值到了Jquery.init的原型上,请看下面代码:

function Jquery(selector, context) {
 return new Jquery.prototype.init(selector, context);
}

Jquery.prototype = {
 version:'1.01',
 init: function () {
  this.name = "lin";
  return this;
 }
}

Jquery.prototype.init.prototype = Jquery.prototype; //画龙点睛之笔

var a = Jquery();
var b = Jquery();
console.log(a.version); //1.01
console.log(a.name); //lin
a.name = "na";
console.log(b.name); //na

可以看到,我们控制台打印a对象的version属性,已经可以读取并且打印出来了。

至此,已经完成了Jquery的无new构建。

ps:jQuery.fn其实就是jQuery的prototype,jquery源码可以看到该条语句:jQuery.fn = jQuery.prototype = {};

$()和jquery()其实是一样的,jquery源码可以看到该条语句: window.jQuery = window.$ = jQuery;

原型 prototype

认识一下什么是原型?

在JavaScript中,原型也是一个对象,通过原型可以实现对象的属性继承,JavaScript的对象中都包含了一个" [[Prototype]]"内部属性,这个属性所对应的就是该对象的原型。

对于"prototype"和"__proto__"这两个属性有的时候可能会弄混,"Person.prototype"和"Person.__proto__"是完全不同的。

在这里对"prototype"和"__proto__"进行简单的介绍:

对于所有的对象,都有__proto__属性,这个属性对应该对象的原型

对于函数对象,除了__proto__属性之外,还有prototype属性,当一个函数被用作构造函数来创建实例时,该函数的prototype属性值将被作为原型赋值给所有对象实例(也就是设置实例的__proto__属性)

function Person(name, age){
this.name = name;
this.age = age;
}
Person.prototype.getInfo = function(){
console.log(this.name + " is " + this.age + " years old");
};
//调用
var will = new Person("Will", 28);
will.getInfo();//"Will is 28 years old"

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

jQuery 相关文章推荐
jquery实现全选、全不选以及单选功能
Mar 23 jQuery
jQuery实现鼠标经过显示动画边框特效
Mar 24 jQuery
jquery实现一个全局计时器(商城可用)
Jun 30 jQuery
jQuery修改DOM结构_动力节点Java学院整理
Jul 05 jQuery
jQuery EasyUI的TreeGrid查询功能实现方法
Aug 08 jQuery
jQuery实现的简单动态添加、删除表格功能示例
Sep 21 jQuery
jQuery封装animate.css的实例
Jan 04 jQuery
jQuery中的类名选择器(.class)用法简单示例
May 14 jQuery
jQuery使用动画队列自定义动画操作示例
Jun 16 jQuery
jquery操作select常见方法大全【7种情况】
May 28 jQuery
JQuery常用简单动画操作方法回顾与总结
Dec 07 jQuery
JQuery获得内容和属性方法解析
May 30 jQuery
判断jQuery是否加载完成,没完成继续判断的解决方法
Dec 06 #jQuery
基于jQuery Ajax实现下拉框无刷新联动
Dec 06 #jQuery
jquery如何实现点击空白处隐藏元素
Dec 05 #jQuery
jQuery实现验证表单密码一致性及正则表达式验证邮箱、手机号的方法
Dec 05 #jQuery
将jquery.qqFace.js表情转换成微信的字符码
Dec 01 #jQuery
利用jquery如何从json中读取数据追加到html中
Dec 01 #jQuery
JS和JQuery实现雪花飘落效果
Nov 30 #jQuery
You might like
ubuntu 编译安装php 5.3.3+memcache的方法
2010/08/05 PHP
PHP设计模式之观察者模式定义与用法示例
2018/08/04 PHP
jQuery live( type, fn ) 委派事件实现
2009/10/11 Javascript
javascript获取当前日期时间及其它操作函数
2011/01/11 Javascript
用jQuery模拟页面加载进度条的实现代码
2011/12/19 Javascript
利用谷歌地图API获取点与点的距离的js代码
2012/10/11 Javascript
简单的代码实现jquery定时器
2014/01/03 Javascript
使用javascript实现雪花飘落的效果
2015/01/13 Javascript
JQuery实现动态适时改变字体颜色的方法
2015/03/10 Javascript
js实现文本框只允许输入数字并限制数字大小的方法
2015/08/19 Javascript
Vue2.0如何发布项目实战
2017/07/27 Javascript
Vue内容分发slot(全面解析)
2017/08/19 Javascript
angular指令笔记ng-options的使用方法
2017/09/18 Javascript
vue 监听某个div垂直滚动条下拉到底部的方法
2018/09/15 Javascript
Javascript模块化机制实现原理详解
2020/04/02 Javascript
[27:08]完美世界DOTA2联赛PWL S2 SZ vs Rebirth 第二场 11.21
2020/11/23 DOTA
sqlalchemy对象转dict的示例
2014/04/22 Python
利用Python的Flask框架来构建一个简单的数字商品支付解决方案
2015/03/31 Python
Python中处理字符串之islower()方法的使用简介
2015/05/19 Python
从头学Python之编写可执行的.py文件
2017/11/28 Python
python+splinter自动刷新抢票功能
2018/09/25 Python
PyQt5内嵌浏览器注入JavaScript脚本实现自动化操作的代码实例
2019/02/13 Python
Python图片的横坐标汉字实例
2019/12/04 Python
Python列表切片常用操作实例解析
2019/12/16 Python
Python调用Windows API函数编写录音机和音乐播放器功能
2020/01/05 Python
python GUI编程(Tkinter) 创建子窗口及在窗口上用图片绘图实例
2020/03/04 Python
用CSS3绘制三角形的简单方法
2015/07/17 HTML / CSS
CSS3制作酷炫的条纹背景
2017/11/09 HTML / CSS
canvas与html5实现视频截图功能示例
2016/12/15 HTML / CSS
Club Monaco加拿大官网:设计师男女服装
2019/09/29 全球购物
总务岗位职责
2013/11/19 职场文书
自立自强的名人事例
2014/02/10 职场文书
《月迹》教学反思
2014/02/19 职场文书
工作检讨书怎么写
2014/10/10 职场文书
市委常委会班子党的群众路线教育实践活动整改方案
2014/10/25 职场文书
2015年九一八事变纪念日演讲稿
2015/03/19 职场文书