jquery
的特点就是无new构造和链式调用。
$('xxx')
$('xxx').css().attr().val();
正常的情况下应该是:
function aQuery () {
this.name='test';
return this;
}
console.log(new aQuery());
aquery{
name : 'test',
__proto__ : Object
}
如果不需要new的话,就应该在函数体内实例化。
function aQuery () {
return new aQuery();//但是这样就死循环了...
}
还需要一个构造函数来进行构造:
function aQuery () {
return new aQuery.prototype.init();
}
aQuery.prototype = {
init : function(){
return this;
},
test :function () {
console.log('test');
}
}
//但是这样构造的实例是init,而不是aQuery,无法访问aQuery的原型方法。
//增加一个原型指向
aQuery.prototype.init.prototype = aQuery.prototype;
//这样就可以访问aQuery的原型方法test了。
aQuery().test();
那么如何进行链式调用呢?只需要在每个函数都返回this即可。
function aQuery () {
return new aQuery.prototype.init();
}
aQuery.prototype = {
init : function(){
return this;
},
test :function () {
console.log('test');
return this;
},
add : function(){
//xxx
return this;
}
}
//这样就可以链式调用了
aQuery().test().add();//但是有个缺点,函数都没有确切的返回值。
链式调用只适用于某种特殊情况。 同时还想增加静态方法要如何来做呢?且看 extend
//我们需要提供一个接口,来增加aQuery的原型方法和静态方法。
aQuery.extend = aQuery.prototype.extend = function(object){
//虽然两个函数都指向了一个,但是可以通过this来改变
var target = this;
for(var key in object){
garget[key] = object[key];
}
return target;//一定要返回修改后的this
};
//这样我们就可以通过extend接口增加原型函数和静态函数了
aQuery.extend({
add : function(){
console.log('add');
}
});
aQuery.prototype.extend({
add2 : function(){
console.log('add2');
return this;
}
});
//可以直接调用静态函数
aQuery.add();
//可以矫勇原型函数
aQuery().add2().test();
下面是一个简单的jquery构造的实现:
'use strict';
(function(window,undefined){
var SchoolSelect = function(params){
return new SchoolSelect.fn.init(params);
};
SchoolSelect.fn = SchoolSelect.prototype = {
constructor : SchoolSelect,
init : function(params){
this.cfg = params;
return this;
},
version : '1.0'
};
SchoolSelect.fn.init.prototype = SchoolSelect.fn;
SchoolSelect.extend = SchoolSelect.fn.extend = function(obj) {
var target = this;
for(var k in obj){
target[k] = obj[k];
}
return target;
};
SchoolSelect.extend({
add : function(){
console.log('aaa');
},
age : 11
});
SchoolSelect.fn.extend({
abc : function(){
console.log('bbb');
return 'aaccc';
}
});
window.SchoolSelect = SchoolSelect;
})(window);
转载请注明出处: https://chrunlee.cn/article/jquery-personal-explain.html