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实现tab键进行选择后enter键触发click行为
Mar 29 jQuery
jQuery实现简单的抽奖游戏
May 05 jQuery
使用jQuery.Pin垂直滚动时固定导航
May 24 jQuery
jQuery实现frame之间互通的方法
Jun 26 jQuery
jQuery实现点击关注和取消功能
Jul 03 jQuery
基于jQuery Easyui实现登陆框界面
Jul 10 jQuery
jQuery实现表格冻结顶栏效果
Aug 20 jQuery
基于jquery实现左右上下移动效果
May 02 jQuery
jquery层次选择器的介绍
Jan 18 jQuery
jQuery插件实现非常实用的tab栏切换功能【案例】
Feb 18 jQuery
JQuery+Bootstrap 自定义全屏Loading插件的示例demo
Jul 03 jQuery
jQuery删除/清空指定元素的所有子节点实例代码
Jul 04 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
菜鸟学PHP之Smarty入门
2007/01/04 PHP
PHP连接access数据库
2008/03/27 PHP
jquery ajax abort()的使用方法
2010/10/28 Javascript
字符串的replace方法应用浅析
2011/12/06 Javascript
javascript实现跳转菜单的具体方法
2013/07/05 Javascript
解决Jquery load()加载GB2312页面时出现乱码的两种方案
2013/09/10 Javascript
jQuery选择器全面总结
2014/01/06 Javascript
js仿土豆网带缩略图的焦点图片切换效果实现方法
2015/02/23 Javascript
初步使用Node连接Mysql数据库
2016/03/03 Javascript
Angular实现双向折叠列表组件的示例代码
2017/11/21 Javascript
JavaScript实现多态和继承的封装操作示例
2018/08/20 Javascript
vue动态绑定class选中当前列表变色的方法示例
2018/12/19 Javascript
layui 监听select选择 获取当前select的ID名称方法
2019/09/24 Javascript
JavaScript 实现同时选取多个时间段的方法
2019/10/17 Javascript
JS动态图片的实现方法完整示例
2020/01/13 Javascript
Vue watch响应数据实现方法解析
2020/07/10 Javascript
[03:12]完美世界DOTA2联赛PWL DAY9集锦
2020/11/10 DOTA
python下读取公私钥做加解密实例详解
2017/03/29 Python
python爬虫入门教程--快速理解HTTP协议(一)
2017/05/25 Python
Django实现快速分页的方法实例
2017/10/22 Python
对pandas中Series的map函数详解
2018/07/25 Python
python 地图经纬度转换、纠偏的实例代码
2018/08/06 Python
python2和python3在处理字符串上的区别详解
2019/05/29 Python
pyqt 实现QlineEdit 输入密码显示成圆点的方法
2019/06/24 Python
pandas的qcut()方法详解
2019/07/06 Python
python程序 线程队列queue使用方法解析
2019/09/23 Python
Python实现中值滤波去噪方式
2019/12/18 Python
python实现数字炸弹游戏
2020/07/17 Python
python 实时调取摄像头的示例代码
2020/11/25 Python
canvas绘制表情包的示例代码
2018/07/09 HTML / CSS
婚纱店策划方案
2014/05/22 职场文书
授权委托书范文
2014/07/31 职场文书
学雷锋活动倡议书
2014/08/30 职场文书
故宫英文导游词
2015/01/31 职场文书
初中语文教学研修日志
2015/11/13 职场文书
pytorch 中nn.Dropout的使用说明
2021/05/20 Python