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

2020-05-24 21:36:36易采站长站整理

前言

当我们想要创建一个对象,我们可能使用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.prototype
Jquery.prototype.init.prototype
是互不相干的,我们创建的是
Jquery.prototype.init
对象,所以只能读到
Jquery.prototype.init.prototype