jQuery无new构建实例
var jQuery = function () {
return new jQuery.prototype.init();
}
jQuery.fn = jQuery.prototype = {
jquery: version,
// 共享原型
init: function () {
// 与jQuery共享一个原型对象
},
css: function () {
}
}
共享原型设计
// init共享jQuery原型对象,
jQuery.fn.init.prototype = jQuery.fn;
extend源码设计
/**
* @description 实现对于jQuery或者jQuery实例的扩展,或者对于任意对象的扩展
* @params 第一个参数为{},并且只有一个参数则为jQuery或者jQuery实例的扩展
* 第一参数为Boolean,并且为true,则为深拷贝,
* @type {function(): any}
*/
jQuery.extend = jQuery.fn.extend = function () {
var target = arguments[0] || {};
var isDeep; // 是否是一个深拷贝
var i = 1; // 因为对象扩展的时候第一个参数是不需要动的,所以从1开始
var length = arguments.length;
// 如果是第一个参数是Boolean,为true是深拷贝
if (typeof target === 'boolean') {
isDeep = target;
target = arguments[1];
i = 2;
}
// 第一个参数必须为Object
if (typeof target !== 'object') {
target = {};
}
// 判断当前参数的个数
if (i === length) {
// 只有1个参数用于对jQuery或jQuery实例扩展静态属性及方法,
// 1个参数以上用于给任意对象的扩展
target = this;
// 从0开始,用于扩展每个属性和方法
i--;
}
for (; i < length; i++) {
var options, name, copy, src, clone, copyIsArray;
if ((options = arguments[i]) !== null) {
for (name in options) {
copy = options[name];
src = target[name];
// 如果是深拷贝,并且为数组或者对象
if (isDeep && (jQuery.isObject(copy) || (copyIsArray = jQuery.isArray(copy)))) {
if (copyIsArray) {
copyIsArray = false;
clone = src && jQuery.isArray(src) ? src : [];
} else {
clone = src && jQuery.isObject(src) ? src : {};
}
target[name] = jQuery.extend(isDeep, clone, copy);
} else {
target[name] = copy; // 浅拷贝
}
}
}
}
return target;
};
实现一个mini-jQuery
源码