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实现的动态文字变化输出效果示例【附演示与demo源码下载】
Mar 24 jQuery
jQuery获取复选框选中的当前行的某个字段的值
Sep 15 jQuery
jQuery EasyUI开发技巧总结
Sep 26 jQuery
jQuery实现点击DIV同时点击CheckBox,并为DIV上背景色的实例
Dec 18 jQuery
jquery在启动页面时,自动加载数据的实例
Jan 22 jQuery
jquery写出PC端轮播图实例
Jan 26 jQuery
jQuery超简单遮罩层实现方法示例
Sep 06 jQuery
jQuery 同时获取多个标签的指定内容并储存为数组
Nov 20 jQuery
jquery 插件重新绑定的处理方法分析
Nov 23 jQuery
jquery实现手风琴案例
May 04 jQuery
Jquery如何使用animation动画效果改变背景色的代码
Jul 20 jQuery
jQuery实现朋友圈查看图片
Sep 11 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
世界收音机发展史
2021/03/01 无线电
用ODBC的分页显示
2006/10/09 PHP
关于初学PHP时的知识积累总结
2013/06/07 PHP
php把数据表导出为Excel表的最简单、最快的方法(不用插件)
2014/05/10 PHP
ThinkPHP3.1新特性之对Ajax的支持更加完善
2014/06/19 PHP
php使用ftp实现文件上传与下载功能
2017/07/21 PHP
PHP简单实现模拟登陆功能示例
2017/09/15 PHP
解析Jquery的LigerUI如何实现文件上传
2013/07/09 Javascript
JavaScript 作用域链解析
2014/11/13 Javascript
详解angular中通过$location获取路径(参数)的写法
2017/03/21 Javascript
Nodejs之http的表单提交
2017/07/07 NodeJs
详解使用Vue Router导航钩子与Vuex来实现后退状态保存
2017/09/11 Javascript
electron demo项目npm install安装失败的解决方法
2018/02/06 Javascript
微信小程序按钮去除边框线分享页面功能
2018/08/27 Javascript
vue elementui el-form rules动态验证的实例代码详解
2019/05/23 Javascript
layer弹出层扩展主题的方法
2019/09/11 Javascript
在vue中配置不同的代理同时访问不同的后台操作
2020/09/11 Javascript
vue 子组件和父组件传值的示例
2020/09/11 Javascript
python检测远程服务器tcp端口的方法
2015/03/14 Python
Python 通过pip安装Django详细介绍
2017/04/28 Python
python购物车程序简单代码
2018/04/18 Python
Python tkinter的grid布局及Text动态显示方法
2018/10/11 Python
python实现简单图片物体标注工具
2019/03/18 Python
Python判断对象是否为文件对象(file object)的三种方法示例
2019/04/26 Python
解决在pycharm运行代码,调用CMD窗口的命令运行显示乱码问题
2019/08/23 Python
pip install python 快速安装模块的教程图解
2019/10/08 Python
Python操作列表常用方法实例小结【创建、遍历、统计、切片等】
2019/10/25 Python
Python csv文件的读写操作实例详解
2019/11/19 Python
基于python实现计算且附带进度条代码实例
2020/03/31 Python
Python %r和%s区别代码实例解析
2020/04/03 Python
详解pandas绘制矩阵散点图(scatter_matrix)的方法
2020/04/23 Python
土木工程专业大学毕业生求职信
2013/10/13 职场文书
视光学专业毕业生推荐信
2013/10/28 职场文书
2013年研究生毕业感言
2014/02/06 职场文书
文明家庭先进事迹材料
2014/05/14 职场文书
golang 接口嵌套实现复用的操作
2021/04/29 Golang