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
源码