搜尋
首頁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
es6数组怎么去掉重复并且重新排序es6数组怎么去掉重复并且重新排序May 05, 2022 pm 07:08 PM

去掉重复并排序的方法:1、使用“Array.from(new Set(arr))”或者“[…new Set(arr)]”语句,去掉数组中的重复元素,返回去重后的新数组;2、利用sort()对去重数组进行排序,语法“去重数组.sort()”。

JavaScript的Symbol类型、隐藏属性及全局注册表详解JavaScript的Symbol类型、隐藏属性及全局注册表详解Jun 02, 2022 am 11:50 AM

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于Symbol类型、隐藏属性及全局注册表的相关问题,包括了Symbol类型的描述、Symbol不会隐式转字符串等问题,下面一起来看一下,希望对大家有帮助。

原来利用纯CSS也能实现文字轮播与图片轮播!原来利用纯CSS也能实现文字轮播与图片轮播!Jun 10, 2022 pm 01:00 PM

怎么制作文字轮播与图片轮播?大家第一想到的是不是利用js,其实利用纯CSS也能实现文字轮播与图片轮播,下面来看看实现方法,希望对大家有所帮助!

JavaScript对象的构造函数和new操作符(实例详解)JavaScript对象的构造函数和new操作符(实例详解)May 10, 2022 pm 06:16 PM

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于对象的构造函数和new操作符,构造函数是所有对象的成员方法中,最早被调用的那个,下面一起来看一下吧,希望对大家有帮助。

JavaScript面向对象详细解析之属性描述符JavaScript面向对象详细解析之属性描述符May 27, 2022 pm 05:29 PM

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于面向对象的相关问题,包括了属性描述符、数据描述符、存取描述符等等内容,下面一起来看一下,希望对大家有帮助。

javascript怎么移除元素点击事件javascript怎么移除元素点击事件Apr 11, 2022 pm 04:51 PM

方法:1、利用“点击元素对象.unbind("click");”方法,该方法可以移除被选元素的事件处理程序;2、利用“点击元素对象.off("click");”方法,该方法可以移除通过on()方法添加的事件处理程序。

整理总结JavaScript常见的BOM操作整理总结JavaScript常见的BOM操作Jun 01, 2022 am 11:43 AM

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于BOM操作的相关问题,包括了window对象的常见事件、JavaScript执行机制等等相关内容,下面一起来看一下,希望对大家有帮助。

foreach是es6里的吗foreach是es6里的吗May 05, 2022 pm 05:59 PM

foreach不是es6的方法。foreach是es3中一个遍历数组的方法,可以调用数组的每个元素,并将元素传给回调函数进行处理,语法“array.forEach(function(当前元素,索引,数组){...})”;该方法不处理空数组。

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脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前By尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器