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中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

如何使用WebSocket和JavaScript實現線上語音辨識系統引言:隨著科技的不斷發展,語音辨識技術已成為了人工智慧領域的重要組成部分。而基於WebSocket和JavaScript實現的線上語音辨識系統,具備了低延遲、即時性和跨平台的特點,成為了廣泛應用的解決方案。本文將介紹如何使用WebSocket和JavaScript來實現線上語音辨識系

人臉偵測辨識技術已經是一個比較成熟且應用廣泛的技術。而目前最廣泛的網路應用語言非JS莫屬,在Web前端實現人臉偵測辨識相比後端的人臉辨識有優勢也有弱勢。優點包括減少網路互動、即時識別,大大縮短了使用者等待時間,提高了使用者體驗;弱勢是:受到模型大小限制,其中準確率也有限。如何在web端使用js實現人臉偵測呢?為了實現Web端人臉識別,需要熟悉相關的程式語言和技術,如JavaScript、HTML、CSS、WebRTC等。同時也需要掌握相關的電腦視覺和人工智慧技術。值得注意的是,由於Web端的計

WebSocket與JavaScript:實現即時監控系統的關鍵技術引言:隨著互聯網技術的快速發展,即時監控系統在各個領域中得到了廣泛的應用。而實現即時監控的關鍵技術之一就是WebSocket與JavaScript的結合使用。本文將介紹WebSocket與JavaScript在即時監控系統中的應用,並給出程式碼範例,詳細解釋其實作原理。一、WebSocket技

股票分析必備工具:學習PHP和JS繪製蠟燭圖的步驟,需要具體程式碼範例隨著網路和科技的快速發展,股票交易已成為許多投資者的重要途徑之一。而股票分析是投資人決策的重要一環,其中蠟燭圖被廣泛應用於技術分析。學習如何使用PHP和JS繪製蠟燭圖將為投資者提供更多直觀的信息,幫助他們更好地做出決策。蠟燭圖是一種以蠟燭形狀來展示股票價格的技術圖表。它展示了股票價格的

如何利用JavaScript和WebSocket實現即時線上點餐系統介紹:隨著網路的普及和技術的進步,越來越多的餐廳開始提供線上點餐服務。為了實現即時線上點餐系統,我們可以利用JavaScript和WebSocket技術。 WebSocket是一種基於TCP協定的全雙工通訊協議,可實現客戶端與伺服器的即時雙向通訊。在即時線上點餐系統中,當使用者選擇菜餚並下訂單

如何使用WebSocket和JavaScript實現線上預約系統在當今數位化的時代,越來越多的業務和服務都需要提供線上預約功能。而實現一個高效、即時的線上預約系統是至關重要的。本文將介紹如何使用WebSocket和JavaScript來實作一個線上預約系統,並提供具體的程式碼範例。一、什麼是WebSocketWebSocket是一種在單一TCP連線上進行全雙工

隨著網路金融的快速發展,股票投資已經成為了越來越多人的選擇。而在股票交易中,蠟燭圖是常用的技術分析方法,它能夠顯示股票價格的變動趨勢,幫助投資人做出更精準的決策。本文將透過介紹PHP和JS的開發技巧,帶領讀者了解如何繪製股票蠟燭圖,並提供具體的程式碼範例。一、了解股票蠟燭圖在介紹如何繪製股票蠟燭圖之前,我們首先需要先了解什麼是蠟燭圖。蠟燭圖是由日本人

JavaScript和WebSocket:打造高效的即時天氣預報系統引言:如今,天氣預報的準確性對於日常生活以及決策制定具有重要意義。隨著技術的發展,我們可以透過即時獲取天氣數據來提供更準確可靠的天氣預報。在本文中,我們將學習如何使用JavaScript和WebSocket技術,來建立一個高效的即時天氣預報系統。本文將透過具體的程式碼範例來展示實現的過程。 We
