搜尋
首頁web前端js教程Javascript中object.extend靜態方法使用實例詳解

既然是類,那麼就有抽象類,具體類,類別的繼承,同時,類別的成員可以有實例成員和靜態成員。

先看prototype中的以下的程式碼: 

var Abstract = new Object(); 
Object.extend = function(destination, source) { 
for (property in source) { 
destination[property] = source[property]; 
} 
return destination; 
} 
Object.prototype.extend = function(object) { 
return Object.extend.apply(this, [this, object]); 
}

第一個宣告了一個物件Abstract,Object其實是一個函數,他沒有任何成員,所以是一個空類,所以Abstract也就沒有任何成員。這個暫時不說,後面可以看到這是抽象類別的基礎。先解釋以下這個語法:

function.member=function(){}

在這種情況下,function一般都是已經定義過的,這條語句的作用是給function增加一個靜態成員member,member的內容是等號後面的。如上面第二段程式碼Object.extend=……,就是為Object這個類別增加了一個靜態方法extend。 ok,我們知道如何給一個類別定義靜態成員,那麼你一定很想知道實例成員怎麼定義,很簡單,在類別名稱和成員名稱之間加上prototype:

function.prototype.member=function(){}

prototype不僅可以這麼使用,還可以: 

function.prototype={ 
member1:function(){……}, 
member2:"abc", 
member3:function(){……} 
}

這樣就是實作了實例成員的定義。但prototype代表什麼意思呢?在第一篇我說過,直接用{}括起來,表示一個對象,如Prototype,Class都是這樣定義的全域對象。而看下面一種用法,prototype後面就是一個{}的結構,難道它也是物件?是的,沒錯,prototype其實也是一個物件!在javascript裡,一個物件我們可以任意增加它的成員,用如下的語法:
object.member=function(){……};
只要經過這樣的定義,一個物件就可以立刻有member這個方法! javascript就是這麼神奇!
好,我們現在知道了prototype是一個對象,而function是一個函數或類,那麼我們可以認為prototype是任何一個類別(函數)都內部保留的一個靜態成員。它的功能就是儲存這個類別的所有成員指針,但這些成員都只是原型,沒有經過初始化,這也符合prototype的原義。你可以隨時透過prototype這個物件來擴充成員。在new一個類別時,prototype的成員就經過初始化,然後賦給了實例化的物件。
上面第三段程式碼Object.prototype.extend=……,就是為Object增加了一個實例方法extend,實例方法中就可以引用this指針,指向由這個類別實例化的物件本身。當然,這個物件就具有成員extend。
繼續之前,先了解兩個語句:

for(var p in object){} 
method.apply(object,arguments);

第一句:列舉出一個變數的所有成員,如果是函數,那麼是所有靜態成員;如果是對象,那就是所有實例成員,p的型別是一個字串。表示成員的名稱。引用一個成員不只可以用variabel.member,還可以用variabel["member"]。反過來,賦值也是如此。這就為枚舉一個變數的成員帶來了很大方便。
第二條語句:將method這個方法應用到object去執行,參數是arguments這個陣列。注意:method並不是object的成員。但是,我們可以認為這條語句執行的意思是:object.method(arguments)。這是一個很重要的方法,後面會常用到,你也會逐漸熟悉它的。
下面繼續extend,它是一個非常重要的方法,可以看到它既是類別Object的靜態成員,也是其實例成員,那它有什麼作用呢?讓我們來看:它接收兩個參數,destination和source,如果destination和source都是類,那麼它的功能就是把類source的所有靜態成員都複製給類destination,如果destination和source都是對象,那麼是把所有實例成員複製過來。這時destination中如果已經有同名成員,那麼這個成員將會被覆蓋。也就是說讓destination具有了source的所有成員,並且函數會傳回這個destination。下面看extend作為Object的實例成員:

Object.prototype.extend = function(object) { 
return Object.extend.apply(this, [this, object]); 
}

開始有點暈了,不過不要急,還是可以看懂的,apply語法剛剛已經講過了,它的呼叫者是一個方法,而Object.extend是一個靜態方法,它被應用在this上面,也就是Object的實例,假設為obj,後面方括號是一個數組,包括兩個成員,this和object。這個陣列其實就是Object靜態成員extend的arguments參數。那麼這條語句就相當於執行
obj.extend(this,object);
this不解釋了,表示本身。 object是什麼?參數,恩,是實例方法extend傳來的參數,不要混淆。 extend呢? obj並沒有定義extend實例成員,但透過apply,它可以把Object的靜態成員extend拿來使用,再看一下extend的函數體:

Object.extend = function(destination, source) { 
for (property in source) { 
destination[property] = source[property]; 
} 
return destination; 
}

因为obj是对象,object也是对象,即destination和source都是对象,于是函数的作用就是使obj具有object的所有成员。并且会返回obj。听起来有点拗口,但逻辑很简单:让obj“继承于”object!很好,我们看到了继承,但你肯定会问,对象的继承,第一次听说啊,我们讲继承都是讲的类的继承。没错,现在的确还没有看到真正的类继承,但已经近在眼前了:类不就是有个prototype吗,而prototype是对象!
好,想到这一点,类的继承语法看似很简单了:

b.prototype.extend(a.prototype);

让b继承a。
可是事实却没那么简单:prototype是存放方法原型指针,extend方法没有初始化,不能使用!要使用extend,就必须实例化一个对象。还是看看prototype是怎么做的吧:

b.prototype=(new a()).extend(b.prototype);

很高明的办法!充分说明了函数其实也是一个变量的道理。先实例化a对象,然后在它基础上调用extend,将所有的成员b.prototype的成员覆盖到a的对象,然后把这个a对象再赋值给b.prototype。完成了b从a继承的工作。在实际使用中,一般的用法都是:

b.prototype=(new a()).extend({});

因为让一个b继承自a,通常b之前都是一个未定义的类,所以后面的{}中其实就可以定义类成员。当然,你也可以先定义,再继承,只是和传统概念有所区别了。 

以上是Javascript中object.extend靜態方法使用實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
JavaScript的起源:探索其實施語言JavaScript的起源:探索其實施語言Apr 29, 2025 am 12:51 AM

JavaScript起源於1995年,由布蘭登·艾克創造,實現語言為C語言。 1.C語言為JavaScript提供了高性能和系統級編程能力。 2.JavaScript的內存管理和性能優化依賴於C語言。 3.C語言的跨平台特性幫助JavaScript在不同操作系統上高效運行。

幕後:什麼語言能力JavaScript?幕後:什麼語言能力JavaScript?Apr 28, 2025 am 12:01 AM

JavaScript在瀏覽器和Node.js環境中運行,依賴JavaScript引擎解析和執行代碼。 1)解析階段生成抽象語法樹(AST);2)編譯階段將AST轉換為字節碼或機器碼;3)執行階段執行編譯後的代碼。

Python和JavaScript的未來:趨勢和預測Python和JavaScript的未來:趨勢和預測Apr 27, 2025 am 12:21 AM

Python和JavaScript的未來趨勢包括:1.Python將鞏固在科學計算和AI領域的地位,2.JavaScript將推動Web技術發展,3.跨平台開發將成為熱門,4.性能優化將是重點。兩者都將繼續在各自領域擴展應用場景,並在性能上有更多突破。

Python vs. JavaScript:開發環境和工具Python vs. JavaScript:開發環境和工具Apr 26, 2025 am 12:09 AM

Python和JavaScript在開發環境上的選擇都很重要。 1)Python的開發環境包括PyCharm、JupyterNotebook和Anaconda,適合數據科學和快速原型開發。 2)JavaScript的開發環境包括Node.js、VSCode和Webpack,適用於前端和後端開發。根據項目需求選擇合適的工具可以提高開發效率和項目成功率。

JavaScript是用C編寫的嗎?檢查證據JavaScript是用C編寫的嗎?檢查證據Apr 25, 2025 am 12:15 AM

是的,JavaScript的引擎核心是用C語言編寫的。 1)C語言提供了高效性能和底層控制,適合JavaScript引擎的開發。 2)以V8引擎為例,其核心用C 編寫,結合了C的效率和麵向對象特性。 3)JavaScript引擎的工作原理包括解析、編譯和執行,C語言在這些過程中發揮關鍵作用。

JavaScript的角色:使網絡交互和動態JavaScript的角色:使網絡交互和動態Apr 24, 2025 am 12:12 AM

JavaScript是現代網站的核心,因為它增強了網頁的交互性和動態性。 1)它允許在不刷新頁面的情況下改變內容,2)通過DOMAPI操作網頁,3)支持複雜的交互效果如動畫和拖放,4)優化性能和最佳實踐提高用戶體驗。

C和JavaScript:連接解釋C和JavaScript:連接解釋Apr 23, 2025 am 12:07 AM

C 和JavaScript通過WebAssembly實現互操作性。 1)C 代碼編譯成WebAssembly模塊,引入到JavaScript環境中,增強計算能力。 2)在遊戲開發中,C 處理物理引擎和圖形渲染,JavaScript負責遊戲邏輯和用戶界面。

從網站到應用程序:JavaScript的不同應用從網站到應用程序:JavaScript的不同應用Apr 22, 2025 am 12:02 AM

JavaScript在網站、移動應用、桌面應用和服務器端編程中均有廣泛應用。 1)在網站開發中,JavaScript與HTML、CSS一起操作DOM,實現動態效果,並支持如jQuery、React等框架。 2)通過ReactNative和Ionic,JavaScript用於開發跨平台移動應用。 3)Electron框架使JavaScript能構建桌面應用。 4)Node.js讓JavaScript在服務器端運行,支持高並發請求。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具