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

作者:三十亿少女的梦 时间:2024-04-22 22:20:20 

前言

当我们想要创建一个对象,我们可能使用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"

来源:http://www.cnblogs.com/yonglin/p/7995555.html

标签:jquery,无new,构建
0
投稿

猜你喜欢

  • python 中 .py文件 转 .pyd文件的操作

    2022-02-17 09:59:38
  • 利用tcpdump对mysql进行抓包操作技巧

    2024-01-23 04:52:50
  • PostgreSQL 如何获取当前日期时间及注意事项

    2024-01-17 12:00:10
  • Python实现获取前100组勾股数的方法示例

    2022-07-14 08:54:23
  • MySQL的join buffer原理

    2024-01-28 01:44:19
  • Python 字符串的有关知识详解

    2022-03-14 16:54:12
  • 海量数据库的查询优化及分页算法方案集合2/2

    2024-01-22 22:09:38
  • 利用python对mysql表做全局模糊搜索并分页实例

    2024-01-20 05:29:47
  • python重试装饰器示例

    2022-07-28 10:03:12
  • Oracle 函数大全[字符串函数,数学函数,日期函数]第1/4页

    2009-03-04 10:56:00
  • REPAIR TABLE语法介绍——MySQL数据库

    2012-01-05 19:08:59
  • PHP实现无限极分类的两种方式示例【递归和引用方式】

    2023-11-15 18:26:33
  • 学习ASP.NET八天入门:第七天

    2007-08-07 13:52:00
  • 用python爬虫爬取CSDN博主信息

    2023-06-13 08:11:10
  • Vue组件通信方法案例总结

    2023-07-02 16:51:58
  • vue关于eslint空格缩进等的报错问题及解决

    2024-05-10 14:09:26
  • python 虚拟环境详解

    2021-09-15 15:39:09
  • MySQL索引失效原理

    2024-01-19 01:00:50
  • Python + selenium 自动化测试框架详解

    2021-01-15 00:06:35
  • Python之京东商品秒杀的实现示例

    2023-01-31 05:49:07
  • asp之家 网络编程 m.aspxhome.com