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


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

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

1.除了循環遍歷復制,還能怎樣

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

我當時回答了2.

現在想想,我好SB啊,因為他剛問完我如何編寫JQuery插件($.extend()).......

使用說明:

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;
};

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

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM