Javascript物件導向編程

來源:互聯網
上載者:User

Javascript的重要性
使用率
1、在web應用中,涉及到前端介面編程基本上都要用到javascript語言;
2、Web2.0及Ajax推動了javascript語言。
3、隨著大量的c/s應用轉向b/s,富用戶端技術的不斷推廣,javascript語言的應用範圍還將不斷加大;
javascript的特點
簡單
動態
基於對象(物件導向)

Javascript物件導向概述
Javascript是一種面向(基於)對象的動態指令碼語言,是一種基於對象(Object)和事件驅動(EventDriven)並具有安全效能的指令碼語言。他具有物件導向語言所特有的各種特性,比如封裝、繼承及多態等。但對於大多數人說,我們只把javascript做為一個函數式語言,只把他用於一些簡單的前端資料輸入驗證以及實現一些簡單的頁面動態效果等,我們沒能完全把握動態語言的各種特性。
在很多優秀的Ajax架構中,比如ExtJS、JQuery等,大量使用了javascript的物件導向特性,要使用好ext技術,javascript的進階特性,物件導向語言特性是我們必須完全把握的。

Javascript的相關知識
Javascript的發展曆程
Javascript的三大組成部分
ECMAScript
文法\資料類型\語句\關鍵字\保留字\操作符\對象
DOM(Document Object Model)
BOM(Browser Object Model)

JavaScript靈活特性探討
1、動態語言的靈性測試
Javascript作為一種動態語言,具有非常靈活的我發,在使用的過程中需要靈活掌握及應用他的動態特性,才會得心應手。
思考下面的輸出
複製代碼 代碼如下:
function Animal(name){
this.name=name;
this.age=0;
};
var a1=Animal;//輸出:
var a2=Animal();//輸出:
var a3=new Animal();//輸出:
var a4=new Animal;//輸出:


Javascript中的資料類型
基礎資料型別 (Elementary Data Type)
數字(Numbers)
字串(Strings)
布爾Boolean
特殊值(null、undefined、NaN)。
物件類型Object
對象屬於複雜的資料類型,對象下面可以包含基本類型、對象、函數等,數組是一種物件類型。對於javascript來說,可以說一切都是對象,包括類!。
var c=new Object();
1、數字類型
  數字類型是所有語言中都存在的基礎資料型別 (Elementary Data Type),javascript中的數字類型主要包括整型(Int)與浮點型(Float)兩種,但實質兩種類型都是以浮點的形式儲存在記憶體中。數字類型在javascript中一般與數字常量的形式出現在程式中,一般情況下是基於10進位的資料,由0-9這10個數字組成,比如110、150等,而也可以是以0x開頭(由0-9以及a到f等16個字元組成)的16進位資料,比如0xff轉換成10進位就是255(即 15*16 + 15 = 255);一些javascript實現還支援8進位資料,也就是以0開頭的資料(由0-7這8個數字組成),比如0377 這個八位元據轉換成10進位就是255,即( 3*64 + 7*8 + 7 = 255 )。
2、字元類型
  字串由各種字元、數字及特殊字元串組成,可以在程式中直接使用單引號或雙引號來產生字串常量。字串中不能有斷行符號符,要在字串包含斷行符號需要使用逸出字元\n。下面是一些簡單的字串常量:
"" // The empty string: it has zero characters
'testing'
"3.14"
'name="myform"'
"Wouldn't you prefer O'Reilly's book?"
"This string\nhas two lines"
"π is the ratio of a circle's circumference to its diameter"

3、布爾Boolean
布爾類型用來表示真或假,在javascript中,當用於布爾運算時,除了0、Null 字元、null、undefined、NaN等以外的資料都是表示真。
if(0||""||false||null||undefined||NaN)alert("有一個條件返回true了");
布爾常量只有false及true,False及True不是常量。

4、物件類型
javascript是基於對象的語言,對象是其核心。

程式流程式控制制
順序結構
if條件選擇語句
switch選擇語句
while迴圈語句
do while語句
for迴圈語句
break與continue語句

for...in迴圈語句
for(變數 in 集合或對象)
{
執行語句塊
}
複製代碼 代碼如下:
<script language="javascript">
var as= [1,4,5,6],output="";
for(var x in as)
{
output += " x= " + as[x];
}
alert(output);
</script>
var as={id:5,name:'test'};
for(var x in as)
{
output += x+"="+as[x];
}
alert(output);

邏輯運算子
&&
邏輯與,當左右兩邊運算元都為true時,傳回值為true,否則返回false。

邏輯或,當左右兩邊運算元都為false時,返回其中第一個不為false的值或者false。
!
邏輯非,當運算元為true時,傳回值為false,否則返回true。
注意:
在邏輯運算中,0、""、false、null、undefined、NaN均表示false。

函數的定義及調用
定義一個函數的格式如下:
function 函數名(參數列表)
{
程式碼
return 運算式;
}
複製代碼 代碼如下:
<script language="javascript">
var msg = "全域變數";
function square(x,y)
{
var sum;
sum = x*x + y*y;
return sum;
}
function show()
{
var msg = "局部變數";
alert(msg);
}
//var sum;
alert("sum=" + sum);
sum=square(2,3);
alert("sum=" + sum);
show();
</script>

undefined
alert("sum=" + square(2,3));

對函數進行調用的幾種方式:
函數名(傳遞給函數的參數1,傳遞給函數的參數2,….)
變數 = 函數名(傳遞給函數的參數1,傳遞給函數的參數2,….)
對於有傳回值的函數調用,也可以在程式中直接使用返回的結果,例如:alert("sum=“ + square(2,3));
不指定任何函數值的函數,返回undefined。

函數的參數可變性(arguments)
複製代碼 代碼如下:
<script language="javascript">
function sum()
{
var s= 0;
for(var i=0; i<arguments.length; i++)
s+= arguments[i];
return s;
}
sum(1,2);
sum(3,4,5);
</script>

最多255個。通過函數對象的length可以返回函數希望提供的參數個數。
函數參數的可變性
function add(s,b){
if(s)alert(“第一個參數是:”+s);
if(!b)alert(“沒有第二個參數!”);
else alert(“第二個參數是:”+b);
}
arguments
Arguments是一個類似數組但不是數組的對象,說它類似數組是因為其具有數組一樣的訪問性質及方式,可以由arguments[n]來訪問對應的單個參數的值,並擁有數組長度屬性length。
如何寫一個方法,能實現任意多個數的求和?
alert(sum(1,2,3));//輸出6
alert(sum(100,200,500,900));//輸出1700

使用Function類建立函數
建立動態函數的基本文法格式:
var varName = new Function(argument1,...,lastArgument);
說明:
所有的參數都必須是字串型的,最後的參數必須是這個動態函數的功能程式碼。
例子:
複製代碼 代碼如下:
<script language="javascript">
var square = new Function ("x","y",
"var sum;sum= x*x + y*y;return sum;");
alert(square(3,2));
var alsoDoSquare = doAdd;
alert(alsoDoSquare (3,2));
</script>


多想一想:
動態函數有什麼作用,在什麼情況下用動態函數。

閉包(closure)
Javascript閉包就是在另一個範圍中儲存了一份它從上一級函數或範圍取得的變數(索引值對),而這些索引值對是不會隨上一級函數的執行完成而銷毀。
這樣在執行完var c=a()後,變數c實際上是指向了函數b,b中用到了變數i,再執行c()後就會彈出一個視窗顯示i的值(第一次為1)。這段代碼其實就建立了一個閉包,為什嗎?因為函數a外的變數c引用了函數a內的函數b,就是說:

當函數a的內建函式b被函數a外的一個變數引用的時候,就建立了一個我們通常所謂的“閉包”。
複製代碼 代碼如下:
function a() {
var i = 0;
function b() {
alert(++i);
}
return b;
}
var c = a();
c();

閉包的作用就是在a執行完並返回後,閉包使得Javascript的記憶體回收機制GC不會收回a所佔用的資源,因為a的內建函式b的執行需要依賴a中的變數。

函數的範圍及this
1、在函數或方法中可以使用this來引用函數所在的當前對象
2、當沒有明確指定函數的當前對象時,範圍為window
3、可以使用call及apply來動態改變函數執行的範圍

複製代碼 代碼如下:
var b1={v:"this is b1"};
var b2={v:"this is b2"};
function b(d){
alert(this.v);
}
b();//輸出:
window.b();//輸出:
b.call(b1);//輸出:
b.apply(b2);//輸出:


詞法範圍(lexcical scope)。通俗地講,就是javascript變數的範圍是在定義時決定而不是執行時決定,也就是說詞法範圍取決於源碼,編譯器通過靜態分析就能確定,因此詞法範圍也叫做靜態範圍(static scope)。但需要注意,with和eval的語義無法僅通過靜態技術實現,所以只能說javascript的範圍機制非常接近詞法範圍(lexical scope).
javascript引擎在執行每個函數執行個體時,都會建立一個執行環境(execution context)。執行環境中包含一個調用對象(call object)
調用對象是一個scriptObject結構(scriptObject是與函數相關的一套靜態系統,與函數執行個體的生命週期保持一致),用來儲存內部變數表varDecls、內嵌函數表funDecls、父級引用列表 upvalue等文法分析結構(注意varDecls和funDecls等資訊是在文法分析階段就已經得到,並儲存在文法樹中。函數執行個體執行時,會將這些資訊從文法樹複製到scriptObject上)。

apply and call:它們的作用都是將函數綁定到另外一個對象上去運行,兩者僅在定義參數方式有所區別:
apply(thisArg,argArray);
call(thisArg[,arg1,arg2…] ]);
即所有函數內部的this指標都會被賦值為thisArg,這可實現將函數作為另外一個對象的方法啟動並執行目的。

apply的說明
如果 argArray 不是一個有效數組或者不是 arguments 對象,那麼將導致一個 TypeError。如果沒有提供 argArray 和 thisArg任何一個參數,那麼 Global 對象將被用作 thisArg,並且無法被傳遞任何參數。

call的說明
call 方法可將一個函數的物件內容從初始的上下文改變為由 thisArg指定的新對象。如果沒有提供 thisArg參數,那麼 Global 對象被用作 thisArg

重點(the point):
應用call和apply還有一個技巧在裡面,就是用call和apply應用另一個函數(類)以後,當前的函數(類)就具備了另一個函數(類)的方法或者是屬性。
在瀏覽執行的javascript中,預設情況下對象的範圍為window。
c.run();
window.c.run();

JavaScript中的系統函數(Global類)
encodeURI及encodeURIComponent方法
返回對一個URI字串編碼後的結果。
decodeURI及decodeURIComponent()方法
將一個已編碼的URI字串解碼成最初始的字串並返回。
parseInt方法
將一個字串按指定的進位轉換成一個整數,文法格式為:parseInt(numString, [radix])。如果沒有指定第二個參數,則首碼為 ‘0x' 的字串被視為十六進位,首碼為 ‘0' 的字串被視為八進位,所有其他字串都被視為是十進位。
parseFloat方法
將一個字串轉換成對應的小數。
isNaN方法
用於檢測parseInt和parseFloat方法的傳回值是否為NaN。
escape方法
返回對一個字串進行編碼後的結果字串。所有空格、標點、重音符號以及任何其他非 ASCII 字元都用 %xx 編碼替換,其中xx等於表示該字元的Unicode編碼的十六進位數,字元值大於255的字元以%uxxxx格式儲存。
unescape 方法
將一個用escape方法編碼的結果字串解碼成原始字串並返回。
eval 方法
將其中的參數字串作為一個JavaScript運算式執行。

JavaScript的內部類
動態對象
使用“對象執行個體名.成員”的格式來訪問其屬性和方法。
靜態對象
直接使用“對象名.成員”的格式來訪問其屬性和方法。

Object類(對象)
Number類(對象)
String類 (對象)
Math類(對象)
Date類(對象)
toString方法

Object類
Object類是所有javascript類的基類,提供了一種建立自訂對象的簡單方式,不需要程式員再定義建構函式。
主要屬性:
constructor-對象的建構函式
prototype-獲得類的prototype對象,static性質
主要方法:
hasOwnProperty(property)-是否屬於本類定義的屬性
isPrototypeOf(object)-是否是指定類的prototype
propertyIsEnumerable(property)-是否可例舉的屬性
toString()-返回對象對應的字串
valueOf()-返回對象對應的原始類型值

<script language="javascript">
function getAttributeValue(attr)
{
alert(person[attr]);
}
var person = new Object();
person.name = "zs";
person.age = 18;
getAttributeValue("name");
getAttributeValue("age");
</script>

Number類
Number類代表資料類,包含一些靜態成員及數值處理的方法。
靜態屬性:
MAX_VALUE、MIN_VALUE、NEGATIVE_INFINITY、POSITIVE_INFINITY、NaN
主要方法:
toFixed(n)-取小數位元,自動四捨五入
toPrecision(n)-是否是指定類的prototype
propertyIsEnumerable(property)-是否可例舉的屬性
toString()-返回對象對應的字串
valueOf()-返回對象對應的原始類型值

複製代碼 代碼如下:
<script language="javascript">
var oNumberObject = new Number(99);
alert(oNumberObject.toFixed(2)); //outputs “99.00”
</script>


String類
length屬性
anchor、big、bold、fontcolor、link等方法
charAt方法
注意:一個字串中的第一個字元的索引位置為0,依次類推。
charCodeAt方法
注意:返回的結果是字元的unicode編碼。
concat方法,連接字串
indexOf方法及lastIndexOf方法
match、search方法
replace、split方法
slice方法
說明:str1.slice(0)和str1.slice(0,-1)都是返回整個字串。
substr、substring方法
substring方法返回的內容不包含結束位置的字元。
toLowerCase、toUpperCase 方法

Math類
屬性:
E,代表數學常數e,約等於 2.718。
LN10,代表10的自然對數,約等於 2.302。
LN2,代表2的自然對數,約等於 0.693。
PI,代表數學常數∏的值,約等於 3.14159。
SQRT1-2,代表2 的平方根分之一,約等於0.707。
SQRT2,代表2 的平方根,約等於1.414。

方法:
abs方法,返回數位絕對值。
sin、cos方法,分別返回數位正弦、餘弦值。
asin、acos方法,分別返回數位反正弦、反餘弦值。
random方法,返回介於 0 和 1 之間的偽隨機數
Math對象是一個靜態類,不能使用new關鍵字建立對象執行個體,應直接使用“對象名.成員”的格式來訪問其屬性或方法,例如,var num = Math.random();

Date類
toGMTString方法,返回Date對象執行個體所表示的日期的字串形式,該字串使用格林尼治標準時間 (GMT) 格式,例如,“05 Jan 1996 00:00:00 GMT”。
getYear、getMonth、getDate、getDay方法
getHours、getMinutes、getSeconds、getMilliseconds方法
getTime方法,返回自1970年1月1日0點0分0秒算起,至Date對象執行個體代表的時間為止的毫秒數。
複製代碼 代碼如下:
<script language="javascript">
var current_time = new Date();
var strDate = current_time.getYear() + "年";
strDate += current_time.getMonth() + "月";
strDate += current_time.getDate() + "日 ";
strDate += current_time.getHours() + ":";
strDate += current_time.getMinutes() + ":";
strDate += current_time.getSeconds();
alert(strDate);
</script>

構造方法 :Date()、Date(dateVal) 、Date(year, month, date[, hours[, minutes[, seconds[,ms]]]])
parse方法,分析一個表示日期時間的字串,返回它所表示的時間值,該值以自1970年1月1日0點0分0秒算起的毫秒值表示。parse方法屬於一個靜態方法 。

toString方法
toString 方法是JavaScript中的所有內部對象的一個成員方法,它的主要作用就是將對象中的資料轉換成某種格式的字串來表示,具體的轉換方式取決於對象的類型。

舉例:
複製代碼 代碼如下:
<script language="javascript">
var x = 328;
alert("hex=“ + x.toString(16) + " bin=“ + x.toString(2));
</script>

Array類
三種構造方法:
Array()
Array(4)
Array(3.5,"abc",3)

數組排序例子:
複製代碼 代碼如下:
<script language="javascript">
var arr = new Array();
arr[0] = 3.5;
arr[1] = "abc"
arr[2] = 3;
arr.sort();
var x,str = "";
for(x in arr)
{
str += x + ":“ + arr[x] + "\n";
}
alert(str);
</script>

Array類的屬性及方法
length-獲得數組的長度;
concat-串連數組;
join-把數群組轉換成字串;
pop-彈出一個元素;
push-放入一個元素;
reverse-顛倒資料中的元素順序;
shift-移出第一個元素;
slice-截取數組;
sort-排序數組;
unshift-在前面追加元素;

用對象的方式實現數組
複製代碼 代碼如下:
<script language="javascript">
function MyArray()
{
this.length = arguments.length;
for (var i=0; i<this.length;i++)
{
this[i] = arguments[i];
}
}
var str = "";
var arr = new MyArray(4,3.5,"abc");
for(var i=0; i<arr.length; i++)
{
str += arr[i] + "\n";
}
alert(str);
</script>
<script language="javascript">
function MyArray(size)
{
this.length = size;
for (var i=0; i<size; i++)
{
this[i] = "";
}
}
var arr = new MyArray(2);
arr[0] = 3;
arr[1] = "abc";
arr[2] = 4;
var x, str = "";
for(x in arr)
{
str += x + ":" + arr[x] + "\n";
}
alert(str);
</script>


使用者自訂類及對象
1、Factory 方法-使用new Object建立對象並添加相關屬性;
2、使用建構函式來定義類。
3、使用prototype
4、建構函式及原型混合方式
5、動態原型方式
執行個體
Car類(對象)
屬性:
color-顏色
doors-門的個數
price-價格
drivers-司機
方法:
showColor-顯示出車的顏色

typeof及instanceof 運算子
delete操作符用來刪除一個對象的指定成員。
typeof xx-string返回xx對象的類型或undefined。
var d=7.5;
alert(typeof d);
alert(typeof d2);
alert(typeof new Object());
alert(typeof Object);

xx instanceof 類名,返回boolean類型:
複製代碼 代碼如下:
<script language="javascript">
var o = new String("ab");
alert(o instanceof String);
alert(o instanceof Number);
alert(o instanceof Object);
</script>


delete及void 操作符
delete操作符用來刪除一個對象的指定成員。
var d=new Object();
d.p1="this is p1";
alert(d.p1);
delete d.p1;
alert(d.p1);
delete只能刪除使用者自義的成員。
delete d.toString;
alert(d.toString());
void 用來把任一數字轉換為undefined。
var d=new Object();
alert(void(d));
運用情境:
<a href=”javascript:window.open(‘about:blank')”>Click Me</a>

類的修改
1、prototype詳解
2、給已有類添加新方法
3、重新定義類的方法
4、超級後置綁定

prototype是Function對象的一個屬性,當我們訪問對象的一個成員時,先在對象內部找,如果找不到,則到對象所在類的prototype對象中找。

封裝
封裝:封裝,也就是把客觀事物封裝成抽象的類,並且類可以把自己的資料和方法只讓可信的類或者對象操作,對不可信的進行資訊隱藏。
javascript中,通過閉包可以實現封裝,看代碼例子。
涵蓋了javascript公有成員定義、私人成員定義、特權方法定義的簡單樣本!
複製代碼 代碼如下:
<script>
//定義一個javascript類
function JsClass(privateParam/* */,publicParam){//建構函式
var priMember = privateParam; //私人變數
this.pubMember = publicParam; //公開變數
//定義私人方法
function priMethod(){
return "priMethod()";
}
//定義特權方法
//特權方法可以訪問所有成員
this.privilegedMethod = function(){
var str = "這是特權方法,我調用了\n";
str += " 私人變數:" + priMember +"\n";
str += " 私人方法:" + priMethod() +"\n";
str += " 公開變數:" + this.pubMember +"\n";
str += " 公用方法:" + this.pubMethod();

return str;
}
}
//添加公用方法
//不能調用私人變數和方法
JsClass.prototype.pubMethod = function(){
return "pubMethod()";
}

//使用 JsClass的執行個體
JsObject = new JsClass("priMember","pubMember");

//alert(JsObject.pubMember);//彈出pubMember資訊
//alert(JsObject.priMember);//彈出undefined資訊
//alert(JsObject.pubMethod());//彈出pubMethod資訊
//alert(JsObject.priMethod());//彈出"對象不支援此屬性或方法"的錯誤
alert(JsObject.privilegedMethod());
</script>



涵蓋了javascript公有成員定義、私人成員定義、特權方法定義的簡單樣本!
複製代碼 代碼如下:
<script>
//定義一個javascript類
function JsClass(privateParam/* */,publicParam){//建構函式
var priMember = privateParam; //私人變數
this.pubMember = publicParam; //公開變數
//定義私人方法
function priMethod(){
return "priMethod()";
}
//定義特權方法
//特權方法可以訪問所有成員
this.privilegedMethod = function(){
var str = "這是特權方法,我調用了\n";
str += " 私人變數:" + priMember +"\n";
str += " 私人方法:" + priMethod() +"\n";
str += " 公開變數:" + this.pubMember +"\n";
str += " 公用方法:" + this.pubMethod();

return str;
}
}
//添加公用方法
//不能調用私人變數和方法
JsClass.prototype.pubMethod = function(){
return "pubMethod()";
}

//使用 JsClass的執行個體
JsObject = new JsClass("priMember","pubMember");

//alert(JsObject.pubMember);//彈出pubMember資訊
//alert(JsObject.priMember);//彈出undefined資訊
//alert(JsObject.pubMethod());//彈出pubMethod資訊
//alert(JsObject.priMethod());//彈出"對象不支援此屬性或方法"的錯誤
alert(JsObject.privilegedMethod());
</script>


繼承
物件導向編程 (OOP)語言的一個主要功能就是“繼承”。繼承是指這樣一種能力:它可以使用現有類的所有功能,並在無需重新編寫原來的類的情況下對這些功能進行擴充。
1、對象冒充
2、call及apply
3、原型鏈
4、混合方式

繼承-對象冒充
複製代碼 代碼如下:
function classA(name) {
this.name=name;
this.showName=function(){alert(this.name);}
}
function classB(name) {
this.newMethod = classA;
this.newMethod(name);
}
obj = new classA("hero");
objB = new classB("dby");
obj.showName(); // print hero
objB.showName(); // print dby 說明classB 繼承了classA的方法.
對象冒充可以實現多重繼承 例如
function classz(){
this.newMethod = classX;
this.newMethod();
delete this.newMethod;
}

但是如果classX和classY有相同的屬性或者方法,classY具有高優先順序.

繼承-call方法
call方法使與經典的對象冒充法就相近的方法,它的第一個參數用作this的對象,其他參數都直接傳遞給函數自身.
複製代碼 代碼如下:
function sayName(perfix) {
alert(perfix+this.name);
}
obj= new Object();
obj.name="hero";
sayName.call(obj,"hello," );
function classA(name) {
this.name=name;
this.showName=function(){alert(this.name);};
}
function classB(name) {
classA.call(this,name);
}
objB = new classB("bing");
objB.showName();////說明classB繼承classA的showName方法

繼承-apply方法
aplly()方法有2個參數,一個用作this對象,一個使傳遞給函數的參數數組.
複製代碼 代碼如下:
function sayName(perfix) {
alert(perfix+this.name);
}
obj= new Object();
obj.name="hero";
sayName.aplly(obj,new Array("hello,") );

繼承-原型鏈
prototype對象的任何屬性和方法都會被傳遞給對應類的所有執行個體,原型鏈就是用這種方式來顯現繼承.
function classA (){}
classA.prototype.name="hero";
classA.prototype.showName=function(){alert(this.name)}
function classB(){}
classB.prototype=new classA();
objb = new classB()
objb.showName();//print hero 說明b繼承了a的方法
這裡需要注意 調用classA的建構函式時,沒有給它傳遞參數,這是原型鏈的標準做法,確保函數的建構函式沒有任何參數.
並且 子類的所有屬性和方法,必須出現在prototype屬性被賦值後,應為在它之前賦的值會被刪除.因為對象的prototype屬性被替換成了新對象,添加了新方法的原始對象將被銷毀.

繼承-混和方式
就是用冒充方式 定義建構函式屬性,用原型法定義對象方法.
複製代碼 代碼如下:
function classA(name) {
this.name=name;
}
classA.prototype.showName=function(){alert(this.name)}
function classB(name) {
classA.call(this,name);
}
classB.prototype = new classA();
classB.prototype.showName1=function(){alert(this.name+"*****");};
obj = new classB("hero");
obj.showName();
obj.showName1();

在classB的建構函式中通過調用call方法 繼承classA中的name屬性,用原型鏈來繼承classA的showName方法.

javascript中的方法重載探討
方法重載(overloading)及覆蓋(overriding)
Javascript 中的方法本身就是一個帶可變參數的,不支援重載操作。但我們可以在方法體內自由檢測方法的參數情況,來實現重載的效果。(使用可變參數或arguments 來類比重載的樣本)。
覆蓋,也稱為改寫,就是指子類中定義的方法替換掉父類的方法

javascript中多態性(polymorphisn)探討
多態性(polymorphisn):是允許你將父物件設定成為和一個或更多的他的子物件相等的技術,賦值之後,父物件就可以根據當前賦值給它的子物件的特性以不同的方式運作。簡單的說,就是一句話:允許將子類類型的指標賦值給父類類型的指標。多態是為了實現另一個目的——介面重用!多態的作用,就是為了類在繼承和派生的時候,保證使用“家譜”中任一類的執行個體的某一屬性時的正確調用。
var a=[a1,a2,a3];

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.