JQuery,作为风靡一时的前端框架,其设计的宗旨是“write Less,Do More”,即倡导写更少的代码,做更多的事情。它是具有良好的dom操作性能,被前端工程师所喜爱,JQuery是js封装起来的类库,也属于前段框架,今天就一起看看jq的核心技术之无new构造思想
先实例化一个对象
function JQ(str){
}
JQ.prototype = {
}
new JQ("div")
通常我们都是在外面new,也就是实例化,new实现的是一个this指向的转变,如果没有new,那构造函数内部this指向的就是window,那么原型链就挂载在window上面了,但是每次都new也很麻烦,怎么才能一次实现多次调用无new的函数呢,JQuery就实现了由显式new变成隐式new的过程
function JQ(str){
return new JQ(str)
}
JQ.prototype = {
}
JQ("div")
这里确实无new构造了,但是很明显,死循环了,如何写一个正确的无new构造呢?
function JQ(str){
return new JQ.init(str)
}
JQ.prototype = {
init:function(str){
}
}
JQ("div")
JQ把函数实例化的过程交给它旗下的init()主方法来做,但是也有问题,就是init作为主方法,却无法访问JQ函数的原型上的属性或者方法,因为他的this指向自己,而不是JQ(),巧妙地点来了,既然可以改new的过程,不如把this也改了?
function JQ(str){
return new JQ.init(str)
}
JQ.prototype = {
init:function(str){
}
}
JQ.prototype.init.prototype = JQ.prototype
JQ("div")
这里把init的this重新赋值,让它得以访问JQ的原型,再思考一番,就是形成一个循环,看到这里,我们不得不感叹JQuery的厉害,如果有对原型不太熟悉的同学,还有一种隐式new的方法:
function Fn(str){
}
Fn.prototype = {
}
function JQ(str){
return new Fn(str);
}
JQ("div")
相当于加了一个连通器,省去一个new,让JQ执行new并且把值返回出来