标签:length idc 布尔 method cts 0ms play aac svi
$.extend({ method: function(){ console.log("method") } }) // 调用 $.method(); // method $().method(); // 报错
// fn是prototype的简写(见源码96行) $.fn.extend({ method2: function(){ console.log("method2"); } }) // 调用 $.method2(); // 报错 $().method2(); // method2
var obj = {}; $.extend(obj, {a: 1}, {b: 2}); console.log(obj); // {a: 1, b: 2} // 从第二个参数开始到最后一个参数,他们都会被扩展到obj对象身上。
var person = { info: { age: 18 } } var obj = {} $.extend(obj, person); person.info.age = 20; console.log(obj.info.age); // 20, 被顺带修改了
var person = { info: { age: 18 } } var obj = {} $.extend(true,obj, person); // 第一个实参为true person.info.age = 20; // 修改了 console.log(obj.info.age); // 18,完全不受影响
// 285行 jQuery.extend = jQuery.fn.extend = function () {
var options, name, src, copy, copyIsArray, clone, target = arguments[0] || {}, // 如果没有传入参数,就给个默认值。避免报错 i = 1, length = arguments.length, deep = false; // 这是深浅拷贝的标志,false为浅拷贝,true为深拷贝
if (typeof target === "boolean") { // 这里的 target是第一个参数的值 // 这种情况 $.extend(true, {"a":function(){}})}); deep = target; target = arguments[1] || {}; // 参数转移。deep的值目前便是第一个参数的值,(即 true), // 而target便是第二个参数(即对象 {"a":function(){}})}) i = 2; // 这个i便是决定下面for循环的起始位置(for (var i=2; )) }
if (length === i) { target = this; --i; }
// 311行 for (; i < length; i++) {
// 313行 注意options已经在前面定义了 // $(undefined, {}), for循环遍历时都要判断下元素是不是null或者undefined if ((options = arguments[i]) != null) {
// 这里的options便是传入的一个个的对象。 例子 $.extend({a: function a(){}, b: function(){}})}); for (name in options) { // options 为 {a: function a(){}, b: function(){}})} src = target[name]; // 第一次循环 src = $["a"] copy = options[name]; // 第一次循环 copy = function a(){}; // Prevent never-ending loop if (target === copy) { // 防止循环引用(这种情况 var obj = {}; $.extend(obj, {prop: obj}); ) // target: obj; copy: obj。然后就会跳过循环,不用赋值了 continue; } if (deep && copy && (jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)))) { // 深拷贝 见下面分析 // Don‘t bring in undefined values } else if (copy !== undefined) { // 浅拷贝 target[name] = copy; // 直接赋值就行 } }
if (deep && copy && (jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)))) { if (copyIsArray) { // 是数组的情况 copyIsArray = false; clone = src && jQuery.isArray(src) ? src : []; // 见下面 } else { clone = src && jQuery.isPlainObject(src) ? src : {}; // 这里为什么不直接赋值? clone = []; // 有可能是这种情况 // var obj = {a: {b: 1}}; $.extend(true, obj, {a: {c: 1}}); 如果直接clone = {}; // 那么 结果就是 {a: {c: 1}}。遇到相同的就被覆盖了。 } // Never move original objects, clone them target[name] = jQuery.extend(deep, clone, copy); // 递归调用 // Don‘t bring in undefined values }
return target;
function deepObjCopy(obj) { var copyObj = Array.isArray(obj) ? [] : {}; for (key in obj) { if (obj.hasOwnProperty(key)) { if (obj[key] && (typeof obj[key] === "object")) { // 递归调用, 如[], {}情况。typeof null虽然是object但是转boolean后为false copyObj[key] = deepObjCopy(obj[key]); } else { // 其它数据类型 copyObj[key] = obj[key]; } } } return copyObj; } var obj = { a: { b: 1 } }; var copyedObj = deepObjCopy(obj); obj.a.b = 2; console.log(copyedObj.a.b); // 1 var obj = { a: [{ b: 1 }] }; var copyedObj = deepObjCopy(obj); // console.log(copyedObj) obj.a[0].b = 2; console.log(copyedObj.a[0].b); // 1
标签:length idc 布尔 method cts 0ms play aac svi
原文地址:https://www.cnblogs.com/re-is-good/p/12901875.html