JavaScript中一個對象如何繼承另一個對象

如題,JavaScript中一個對象a如何繼承另一個對象b。即將b中的屬性和方法複製到a中去。javascript

面試中遇到了這個問題,當時腦子裏的想法是:java

1.除了循環遍歷複製,還能怎樣jquery

2.javascript中的原型繼承,不是這樣用的呀,必定是一個‘類’繼承一個對象纔對啊。面試

我當時回答了2.oop

如今想一想,我好SB啊,由於他剛問完我如何編寫JQuery插件($.extend()).......this

使用說明:spa

jQuery.extend([deep], target, object1, [objectN])

返回值:
	Object

概述
	用一個或多個其餘對象來擴展一個對象,返回被擴展的對象。
	若是不指定target,則給jQuery命名空間自己進行擴展。這有助於插件做者爲jQuery增長新方法。 
	若是第一個參數設置爲true,則jQuery返回一個深層次的副本,遞歸地複製找到的任何對象。不然的話,副本會與原對象共享結構。 
	未定義的屬性將不會被複制,然而從對象的原型繼承的屬性將會被複制。

參數
	deep (可選)Object若是設爲true,則遞歸合併。
	targetObject待修改對象。
	object1Object待合併到第一個對象的對象。
	objectN (可選)Object待合併到第一個對象的對象。

JQuery源碼:插件

jQuery.extend = jQuery.fn.extend = function() {
	var options, 
		name, 
		src, 
		copy, 
		copyIsArray, 
		clone,
		target = arguments[0] || {},
		i = 1,
		length = arguments.length,
		deep = false;

	// Handle a deep copy situation
	if ( typeof target === "boolean" ) {
		deep = target;
		target = arguments[1] || {};
		// skip the boolean and the target
		i = 2;
	}

	// Handle case when target is a string or something (possible in deep copy)
	if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
		target = {};
	}

	// 若是隻有一個參數,那將意味着對jquery自身進行擴展
	if ( length === i ) {
		target = this;
		--i;
	}

	for ( ; i < length; i++ ) {
		// Only deal with non-null/undefined values
		if ( (options = arguments[ i ]) != null ) {
			// Extend the base object
			for ( name in options ) {
				src = target[ name ];
				copy = options[ name ];

				// Prevent never-ending loop
				if ( target === copy ) {
					continue;
				}

				// Recurse if we're merging plain objects or arrays
				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 : {};
					}

					// Never move original objects, clone them
					target[ name ] = jQuery.extend( deep, clone, copy );

				// Don't bring in undefined values
				} else if ( copy !== undefined ) {
					target[ name ] = copy;
				}
			}
		}
	}

	// Return the modified object
	return target;
};

其實就是循環賦值啊... 對象

相關文章
相關標籤/搜索