Javascript面向?qū)ο缶幊?/h1>
更新時間:2012年03月18日 14:23:55 作者:
Javascript是一種面向(基于)對象的動態(tài)腳本語言,是一種基于對象(Object)和事件驅(qū)動(EventDriven)并具有安全性能的腳本語言。他具有面向?qū)ο笳Z言所特有的各種特性,比如封裝、繼承及多態(tài)等
Javascript的重要性
使用率
1、在web應用中,涉及到前端界面編程基本上都要用到javascript語言;
2、Web2.0及Ajax推動了javascript語言。
3、隨著大量的c/s應用轉(zhuǎn)向b/s,富客戶端技術(shù)的不斷推廣,javascript語言的應用范圍還將不斷加大;
javascript的特點
簡單
動態(tài)
基于對象(面向?qū)ο?
Javascript面向?qū)ο蟾攀?
Javascript是一種面向(基于)對象的動態(tài)腳本語言,是一種基于對象(Object)和事件驅(qū)動(EventDriven)并具有安全性能的腳本語言。他具有面向?qū)ο笳Z言所特有的各種特性,比如封裝、繼承及多態(tài)等。但對于大多數(shù)人說,我們只把javascript做為一個函數(shù)式語言,只把他用于一些簡單的前端數(shù)據(jù)輸入驗證以及實現(xiàn)一些簡單的頁面動態(tài)效果等,我們沒能完全把握動態(tài)語言的各種特性。
在很多優(yōu)秀的Ajax框架中,比如ExtJS、JQuery等,大量使用了javascript的面向?qū)ο筇匦?,要使用好ext技術(shù),javascript的高級特性,面向?qū)ο笳Z言特性是我們必須完全把握的。
Javascript的相關(guān)知識
Javascript的發(fā)展歷程
Javascript的三大組成部分
ECMAScript
語法\數(shù)據(jù)類型\語句\關(guān)鍵字\保留字\操作符\對象
DOM(Document Object Model)
BOM(Browser Object Model)
JavaScript靈活特性探討
1、動態(tài)語言的靈性測試
Javascript作為一種動態(tài)語言,具有非常靈活的我發(fā),在使用的過程中需要靈活掌握及應用他的動態(tài)特性,才會得心應手。
思考下面的輸出
復制代碼 代碼如下:
function Animal(name){
this.name=name;
this.age=0;
};
var a1=Animal;//輸出:
var a2=Animal();//輸出:
var a3=new Animal();//輸出:
var a4=new Animal;//輸出:
Javascript中的數(shù)據(jù)類型
基本數(shù)據(jù)類型
數(shù)字(Numbers)
字符串(Strings)
布爾Boolean
特殊值(null、undefined、NaN)。
對象類型Object
對象屬于復雜的數(shù)據(jù)類型,對象下面可以包含基本類型、對象、函數(shù)等,數(shù)組是一種對象類型。對于javascript來說,可以說一切都是對象,包括類!。
var c=new Object();
1、數(shù)字類型
數(shù)字類型是所有語言中都存在的基本數(shù)據(jù)類型,javascript中的數(shù)字類型主要包括整型(Int)與浮點型(Float)兩種,但實質(zhì)兩種類型都是以浮點的形式保存在內(nèi)存中。數(shù)字類型在javascript中一般與數(shù)字常量的形式出現(xiàn)在程序中,一般情況下是基于10進制的數(shù)據(jù),由0-9這10個數(shù)字組成,比如110、150等,而也可以是以0x開頭(由0-9以及a到f等16個字符組成)的16進制數(shù)據(jù),比如0xff轉(zhuǎn)換成10進制就是255(即 15*16 + 15 = 255);一些javascript實現(xiàn)還支持8進制數(shù)據(jù),也就是以0開頭的數(shù)據(jù)(由0-7這8個數(shù)字組成),比如0377 這個八進制數(shù)據(jù)轉(zhuǎn)換成10進制就是255,即( 3*64 + 7*8 + 7 = 255 )。
2、字符類型
字符串由各種字符、數(shù)字及特殊字符串組成,可以在程序中直接使用單引號或雙引號來生成字符串常量。字符串中不能有回車符,要在字符串包含回車需要使用轉(zhuǎn)義字符\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、undefined、NaN等以外的數(shù)據(jù)都是表示真。
if(0||""||false||null||undefined||NaN)alert("有一個條件返回true了");
布爾常量只有false及true,F(xiàn)alse及True不是常量。
4、對象類型
javascript是基于對象的語言,對象是其核心。
程序流程控制
順序結(jié)構(gòu)
if條件選擇語句
switch選擇語句
while循環(huán)語句
do while語句
for循環(huán)語句
break與continue語句
for...in循環(huán)語句
for(變量 in 集合或?qū)ο?
{
執(zhí)行語句塊
}
復制代碼 代碼如下:
<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);
邏輯運算符
&&
邏輯與,當左右兩邊操作數(shù)都為true時,返回值為true,否則返回false。
邏輯或,當左右兩邊操作數(shù)都為false時,返回其中第一個不為false的值或者false。
!
邏輯非,當操作數(shù)為true時,返回值為false,否則返回true。
注意:
在邏輯運算中,0、""、false、null、undefined、NaN均表示false。
函數(shù)的定義及調(diào)用
定義一個函數(shù)的格式如下:
function 函數(shù)名(參數(shù)列表)
{
程序代碼
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));
對函數(shù)進行調(diào)用的幾種方式:
函數(shù)名(傳遞給函數(shù)的參數(shù)1,傳遞給函數(shù)的參數(shù)2,….)
變量 = 函數(shù)名(傳遞給函數(shù)的參數(shù)1,傳遞給函數(shù)的參數(shù)2,….)
對于有返回值的函數(shù)調(diào)用,也可以在程序中直接使用返回的結(jié)果,例如:alert("sum=“ + square(2,3));
不指定任何函數(shù)值的函數(shù),返回undefined。
函數(shù)的參數(shù)可變性(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個。通過函數(shù)對象的length可以返回函數(shù)希望提供的參數(shù)個數(shù)。
函數(shù)參數(shù)的可變性
function add(s,b){
if(s)alert(“第一個參數(shù)是:”+s);
if(!b)alert(“沒有第二個參數(shù)!”);
else alert(“第二個參數(shù)是:”+b);
}
arguments
Arguments是一個類似數(shù)組但不是數(shù)組的對象,說它類似數(shù)組是因為其具有數(shù)組一樣的訪問性質(zhì)及方式,可以由arguments[n]來訪問對應的單個參數(shù)的值,并擁有數(shù)組長度屬性length。
如何寫一個方法,能實現(xiàn)任意多個數(shù)的求和?
alert(sum(1,2,3));//輸出6
alert(sum(100,200,500,900));//輸出1700
使用Function類創(chuàng)建函數(shù)
創(chuàng)建動態(tài)函數(shù)的基本語法格式:
var varName = new Function(argument1,...,lastArgument);
說明:
所有的參數(shù)都必須是字符串型的,最后的參數(shù)必須是這個動態(tài)函數(shù)的功能程序代碼。
例子:
復制代碼 代碼如下:
<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>
多想一想:
動態(tài)函數(shù)有什么作用,在什么情況下用動態(tài)函數(shù)。
閉包(closure)
Javascript閉包就是在另一個作用域中保存了一份它從上一級函數(shù)或作用域取得的變量(鍵值對),而這些鍵值對是不會隨上一級函數(shù)的執(zhí)行完成而銷毀。
這樣在執(zhí)行完var c=a()后,變量c實際上是指向了函數(shù)b,b中用到了變量i,再執(zhí)行c()后就會彈出一個窗口顯示i的值(第一次為1)。這段代碼其實就創(chuàng)建了一個閉包,為什么?因為函數(shù)a外的變量c引用了函數(shù)a內(nèi)的函數(shù)b,就是說:
當函數(shù)a的內(nèi)部函數(shù)b被函數(shù)a外的一個變量引用的時候,就創(chuàng)建了一個我們通常所謂的“閉包”。
復制代碼 代碼如下:
function a() {
var i = 0;
function b() {
alert(++i);
}
return b;
}
var c = a();
c();
閉包的作用就是在a執(zhí)行完并返回后,閉包使得Javascript的垃圾回收機制GC不會收回a所占用的資源,因為a的內(nèi)部函數(shù)b的執(zhí)行需要依賴a中的變量。
函數(shù)的作用域及this
1、在函數(shù)或方法中可以使用this來引用函數(shù)所在的當前對象
2、當沒有明確指定函數(shù)的當前對象時,作用域為window
3、可以使用call及apply來動態(tài)改變函數(shù)執(zhí)行的作用域
復制代碼 代碼如下:
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變量的作用域是在定義時決定而不是執(zhí)行時決定,也就是說詞法作用域取決于源碼,編譯器通過靜態(tài)分析就能確定,因此詞法作用域也叫做靜態(tài)作用域(static scope)。但需要注意,with和eval的語義無法僅通過靜態(tài)技術(shù)實現(xiàn),所以只能說javascript的作用域機制非常接近詞法作用域(lexical scope).
javascript引擎在執(zhí)行每個函數(shù)實例時,都會創(chuàng)建一個執(zhí)行環(huán)境(execution context)。執(zhí)行環(huán)境中包含一個調(diào)用對象(call object)
調(diào)用對象是一個scriptObject結(jié)構(gòu)(scriptObject是與函數(shù)相關(guān)的一套靜態(tài)系統(tǒng),與函數(shù)實例的生命周期保持一致),用來保存內(nèi)部變量表varDecls、內(nèi)嵌函數(shù)表funDecls、父級引用列表 upvalue等語法分析結(jié)構(gòu)(注意varDecls和funDecls等信息是在語法分析階段就已經(jīng)得到,并保存在語法樹中。函數(shù)實例執(zhí)行時,會將這些信息從語法樹復制到scriptObject上)。
apply and call:它們的作用都是將函數(shù)綁定到另外一個對象上去運行,兩者僅在定義參數(shù)方式有所區(qū)別:
apply(thisArg,argArray);
call(thisArg[,arg1,arg2…] ]);
即所有函數(shù)內(nèi)部的this指針都會被賦值為thisArg,這可實現(xiàn)將函數(shù)作為另外一個對象的方法運行的目的。
apply的說明
如果 argArray 不是一個有效的數(shù)組或者不是 arguments 對象,那么將導致一個 TypeError。如果沒有提供 argArray 和 thisArg任何一個參數(shù),那么 Global 對象將被用作 thisArg,并且無法被傳遞任何參數(shù)。
call的說明
call 方法可將一個函數(shù)的對象上下文從初始的上下文改變?yōu)橛?thisArg指定的新對象。如果沒有提供 thisArg參數(shù),那么 Global 對象被用作 thisArg
重點(the point):
應用call和apply還有一個技巧在里面,就是用call和apply應用另一個函數(shù)(類)以后,當前的函數(shù)(類)就具備了另一個函數(shù)(類)的方法或者是屬性。
在瀏覽執(zhí)行的javascript中,默認情況下對象的作用域為window。
c.run();
window.c.run();
JavaScript中的系統(tǒng)函數(shù)(Global類)
encodeURI及encodeURIComponent方法
返回對一個URI字符串編碼后的結(jié)果。
decodeURI及decodeURIComponent()方法
將一個已編碼的URI字符串解碼成最初始的字符串并返回。
parseInt方法
將一個字符串按指定的進制轉(zhuǎn)換成一個整數(shù),語法格式為:parseInt(numString, [radix])。如果沒有指定第二個參數(shù),則前綴為 ‘0x' 的字符串被視為十六進制,前綴為 ‘0' 的字符串被視為八進制,所有其他字符串都被視為是十進制。
parseFloat方法
將一個字符串轉(zhuǎn)換成對應的小數(shù)。
isNaN方法
用于檢測parseInt和parseFloat方法的返回值是否為NaN。
escape方法
返回對一個字符串進行編碼后的結(jié)果字符串。所有空格、標點、重音符號以及任何其他非 ASCII 字符都用 %xx 編碼替換,其中xx等于表示該字符的Unicode編碼的十六進制數(shù),字符值大于255的字符以%uxxxx格式存儲。
unescape 方法
將一個用escape方法編碼的結(jié)果字符串解碼成原始字符串并返回。
eval 方法
將其中的參數(shù)字符串作為一個JavaScript表達式執(zhí)行。
JavaScript的內(nèi)部類
動態(tài)對象
使用“對象實例名.成員”的格式來訪問其屬性和方法。
靜態(tài)對象
直接使用“對象名.成員”的格式來訪問其屬性和方法。
Object類(對象)
Number類(對象)
String類 (對象)
Math類(對象)
Date類(對象)
toString方法
Object類
Object類是所有javascript類的基類,提供了一種創(chuàng)建自定義對象的簡單方式,不需要程序員再定義構(gòu)造函數(shù)。
主要屬性:
constructor-對象的構(gòu)造函數(shù)
prototype-獲得類的prototype對象,static性質(zhì)
主要方法:
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類代表數(shù)據(jù)類,包含一些靜態(tài)的成員及數(shù)值處理的方法。
靜態(tài)屬性:
MAX_VALUE、MIN_VALUE、NEGATIVE_INFINITY、POSITIVE_INFINITY、NaN
主要方法:
toFixed(n)-取小數(shù)位數(shù),自動四舍五入
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方法
注意:返回的結(jié)果是字符的unicode編碼。
concat方法,連接字符串
indexOf方法及l(fā)astIndexOf方法
match、search方法
replace、split方法
slice方法
說明:str1.slice(0)和str1.slice(0,-1)都是返回整個字符串。
substr、substring方法
substring方法返回的內(nèi)容不包含結(jié)束位置的字符。
toLowerCase、toUpperCase 方法
Math類
屬性:
E,代表數(shù)學常數(shù)e,約等于 2.718。
LN10,代表10的自然對數(shù),約等于 2.302。
LN2,代表2的自然對數(shù),約等于 0.693。
PI,代表數(shù)學常數(shù)∏的值,約等于 3.14159。
SQRT1-2,代表2 的平方根分之一,約等于0.707。
SQRT2,代表2 的平方根,約等于1.414。
方法:
abs方法,返回數(shù)字的絕對值。
sin、cos方法,分別返回數(shù)字的正弦、余弦值。
asin、acos方法,分別返回數(shù)字的反正弦、反余弦值。
random方法,返回介于 0 和 1 之間的偽隨機數(shù)
Math對象是一個靜態(tài)類,不能使用new關(guān)鍵字創(chuàng)建對象實例,應直接使用“對象名.成員”的格式來訪問其屬性或方法,例如,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對象實例代表的時間為止的毫秒數(shù)。
復制代碼 代碼如下:
<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>
構(gòu)造方法 :Date()、Date(dateVal) 、Date(year, month, date[, hours[, minutes[, seconds[,ms]]]])
parse方法,分析一個表示日期時間的字符串,返回它所表示的時間值,該值以自1970年1月1日0點0分0秒算起的毫秒值表示。parse方法屬于一個靜態(tài)方法 。
toString方法
toString 方法是JavaScript中的所有內(nèi)部對象的一個成員方法,它的主要作用就是將對象中的數(shù)據(jù)轉(zhuǎn)換成某種格式的字符串來表示,具體的轉(zhuǎn)換方式取決于對象的類型。
舉例:
復制代碼 代碼如下:
<script language="javascript">
var x = 328;
alert("hex=“ + x.toString(16) + " bin=“ + x.toString(2));
</script>
Array類
三種構(gòu)造方法:
Array()
Array(4)
Array(3.5,"abc",3)
數(shù)組排序例子:
復制代碼 代碼如下:
<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-獲得數(shù)組的長度;
concat-連接數(shù)組;
join-把數(shù)組轉(zhuǎn)換成字符串;
pop-彈出一個元素;
push-放入一個元素;
reverse-顛倒數(shù)據(jù)中的元素順序;
shift-移出第一個元素;
slice-截取數(shù)組;
sort-排序數(shù)組;
unshift-在前面追加元素;
用對象的方式實現(xiàn)數(shù)組
復制代碼 代碼如下:
<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、工廠方法-使用new Object創(chuàng)建對象并添加相關(guān)屬性;
2、使用構(gòu)造函數(shù)來定義類。
3、使用prototype
4、構(gòu)造函數(shù)及原型混合方式
5、動態(tài)原型方式
實例
Car類(對象)
屬性:
color-顏色
doors-門的個數(shù)
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 用來把任意數(shù)字轉(zhuǎn)換為undefined。
var d=new Object();
alert(void(d));
運用場景:
<a href=”javascript:window.open(‘a(chǎn)bout:blank')”>Click Me</a>
類的修改
1、prototype詳解
2、給已有類添加新方法
3、重新定義類的方法
4、超級后置綁定
prototype是Function對象的一個屬性,當我們訪問對象的一個成員時,先在對象內(nèi)部找,如果找不到,則到對象所在類的prototype對象中找。
封裝
封裝:封裝,也就是把客觀事物封裝成抽象的類,并且類可以把自己的數(shù)據(jù)和方法只讓可信的類或者對象操作,對不可信的進行信息隱藏。
javascript中,通過閉包可以實現(xiàn)封裝,看代碼例子。
涵蓋了javascript公有成員定義、私有成員定義、特權(quán)方法定義的簡單示例!
復制代碼 代碼如下:
<script>
//定義一個javascript類
function JsClass(privateParam/* */,publicParam){//構(gòu)造函數(shù)
var priMember = privateParam; //私有變量
this.pubMember = publicParam; //公共變量
//定義私有方法
function priMethod(){
return "priMethod()";
}
//定義特權(quán)方法
//特權(quán)方法可以訪問所有成員
this.privilegedMethod = function(){
var str = "這是特權(quán)方法,我調(diào)用了\n";
str += " 私有變量:" + priMember +"\n";
str += " 私有方法:" + priMethod() +"\n";
str += " 公共變量:" + this.pubMember +"\n";
str += " 公共方法:" + this.pubMethod();
return str;
}
}
//添加公共方法
//不能調(diào)用私有變量和方法
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公有成員定義、私有成員定義、特權(quán)方法定義的簡單示例!
復制代碼 代碼如下:
<script>
//定義一個javascript類
function JsClass(privateParam/* */,publicParam){//構(gòu)造函數(shù)
var priMember = privateParam; //私有變量
this.pubMember = publicParam; //公共變量
//定義私有方法
function priMethod(){
return "priMethod()";
}
//定義特權(quán)方法
//特權(quán)方法可以訪問所有成員
this.privilegedMethod = function(){
var str = "這是特權(quán)方法,我調(diào)用了\n";
str += " 私有變量:" + priMember +"\n";
str += " 私有方法:" + priMethod() +"\n";
str += " 公共變量:" + this.pubMember +"\n";
str += " 公共方法:" + this.pubMethod();
return str;
}
}
//添加公共方法
//不能調(diào)用私有變量和方法
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>
繼承
面向?qū)ο缶幊?(OOP)語言的一個主要功能就是“繼承”。繼承是指這樣一種能力:它可以使用現(xiàn)有類的所有功能,并在無需重新編寫原來的類的情況下對這些功能進行擴展。
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的方法.
對象冒充可以實現(xiàn)多重繼承 例如
function classz(){
this.newMethod = classX;
this.newMethod();
delete this.newMethod;
}
但是如果classX和classY有相同的屬性或者方法,classY具有高優(yōu)先級.
繼承-call方法
call方法使與經(jīng)典的對象冒充法就相近的方法,它的第一個參數(shù)用作this的對象,其他參數(shù)都直接傳遞給函數(shù)自身.
復制代碼 代碼如下:
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個參數(shù),一個用作this對象,一個使傳遞給函數(shù)的參數(shù)數(shù)組.
復制代碼 代碼如下:
function sayName(perfix) {
alert(perfix+this.name);
}
obj= new Object();
obj.name="hero";
sayName.aplly(obj,new Array("hello,") );
繼承-原型鏈
prototype對象的任何屬性和方法都會被傳遞給對應類的所有實例,原型鏈就是用這種方式來顯現(xiàn)繼承.
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的方法
這里需要注意 調(diào)用classA的構(gòu)造函數(shù)時,沒有給它傳遞參數(shù),這是原型鏈的標準做法,確保函數(shù)的構(gòu)造函數(shù)沒有任何參數(shù).
并且 子類的所有屬性和方法,必須出現(xiàn)在prototype屬性被賦值后,應為在它之前賦的值會被刪除.因為對象的prototype屬性被替換成了新對象,添加了新方法的原始對象將被銷毀.
繼承-混和方式
就是用冒充方式 定義構(gòu)造函數(shù)屬性,用原型法定義對象方法.
復制代碼 代碼如下:
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的構(gòu)造函數(shù)中通過調(diào)用call方法 繼承classA中的name屬性,用原型鏈來繼承classA的showName方法.
javascript中的方法重載探討
方法重載(overloading)及覆蓋(overriding)
Javascript 中的方法本身就是一個帶可變參數(shù)的,不支持重載操作。但我們可以在方法體內(nèi)自由檢測方法的參數(shù)情況,來實現(xiàn)重載的效果。(使用可變參數(shù)或arguments 來模擬重載的示例)。
覆蓋,也稱為改寫,就是指子類中定義的方法替換掉父類的方法
javascript中多態(tài)性(polymorphisn)探討
多態(tài)性(polymorphisn):是允許你將父對象設(shè)置成為和一個或更多的他的子對象相等的技術(shù),賦值之后,父對象就可以根據(jù)當前賦值給它的子對象的特性以不同的方式運作。簡單的說,就是一句話:允許將子類類型的指針賦值給父類類型的指針。多態(tài)是為了實現(xiàn)另一個目的——接口重用!多態(tài)的作用,就是為了類在繼承和派生的時候,保證使用“家譜”中任一類的實例的某一屬性時的正確調(diào)用。
var a=[a1,a2,a3];
相關(guān)文章
-
JavaScript 設(shè)計模式學習 Singleton
JavaScript設(shè)計模式學習 Singleton 2009-07-07
-
new fun的執(zhí)行過程分析,學習面向?qū)ο蟮呐笥芽梢詤⒖枷隆?/div> 2010-08-08
-
XRegExp 0.2: Now With Named Capture
XRegExp 0.2: Now With Named Capture... 2007-11-11
-
javascript面向?qū)ο缶幊檀a,學習js面向?qū)ο缶幊痰呐笥芽梢詤⒖枷隆?/div> 2011-12-12
最新評論
大家感興趣的內(nèi)容
常用在線小工具
Javascript的重要性
使用率
1、在web應用中,涉及到前端界面編程基本上都要用到javascript語言;
2、Web2.0及Ajax推動了javascript語言。
3、隨著大量的c/s應用轉(zhuǎn)向b/s,富客戶端技術(shù)的不斷推廣,javascript語言的應用范圍還將不斷加大;
javascript的特點
簡單
動態(tài)
基于對象(面向?qū)ο?
Javascript面向?qū)ο蟾攀?
Javascript是一種面向(基于)對象的動態(tài)腳本語言,是一種基于對象(Object)和事件驅(qū)動(EventDriven)并具有安全性能的腳本語言。他具有面向?qū)ο笳Z言所特有的各種特性,比如封裝、繼承及多態(tài)等。但對于大多數(shù)人說,我們只把javascript做為一個函數(shù)式語言,只把他用于一些簡單的前端數(shù)據(jù)輸入驗證以及實現(xiàn)一些簡單的頁面動態(tài)效果等,我們沒能完全把握動態(tài)語言的各種特性。
在很多優(yōu)秀的Ajax框架中,比如ExtJS、JQuery等,大量使用了javascript的面向?qū)ο筇匦?,要使用好ext技術(shù),javascript的高級特性,面向?qū)ο笳Z言特性是我們必須完全把握的。
Javascript的相關(guān)知識
Javascript的發(fā)展歷程
Javascript的三大組成部分
ECMAScript
語法\數(shù)據(jù)類型\語句\關(guān)鍵字\保留字\操作符\對象
DOM(Document Object Model)
BOM(Browser Object Model)
JavaScript靈活特性探討
1、動態(tài)語言的靈性測試
Javascript作為一種動態(tài)語言,具有非常靈活的我發(fā),在使用的過程中需要靈活掌握及應用他的動態(tài)特性,才會得心應手。
思考下面的輸出
function Animal(name){
this.name=name;
this.age=0;
};
var a1=Animal;//輸出:
var a2=Animal();//輸出:
var a3=new Animal();//輸出:
var a4=new Animal;//輸出:
Javascript中的數(shù)據(jù)類型
基本數(shù)據(jù)類型
數(shù)字(Numbers)
字符串(Strings)
布爾Boolean
特殊值(null、undefined、NaN)。
對象類型Object
對象屬于復雜的數(shù)據(jù)類型,對象下面可以包含基本類型、對象、函數(shù)等,數(shù)組是一種對象類型。對于javascript來說,可以說一切都是對象,包括類!。
var c=new Object();
1、數(shù)字類型
數(shù)字類型是所有語言中都存在的基本數(shù)據(jù)類型,javascript中的數(shù)字類型主要包括整型(Int)與浮點型(Float)兩種,但實質(zhì)兩種類型都是以浮點的形式保存在內(nèi)存中。數(shù)字類型在javascript中一般與數(shù)字常量的形式出現(xiàn)在程序中,一般情況下是基于10進制的數(shù)據(jù),由0-9這10個數(shù)字組成,比如110、150等,而也可以是以0x開頭(由0-9以及a到f等16個字符組成)的16進制數(shù)據(jù),比如0xff轉(zhuǎn)換成10進制就是255(即 15*16 + 15 = 255);一些javascript實現(xiàn)還支持8進制數(shù)據(jù),也就是以0開頭的數(shù)據(jù)(由0-7這8個數(shù)字組成),比如0377 這個八進制數(shù)據(jù)轉(zhuǎn)換成10進制就是255,即( 3*64 + 7*8 + 7 = 255 )。
2、字符類型
字符串由各種字符、數(shù)字及特殊字符串組成,可以在程序中直接使用單引號或雙引號來生成字符串常量。字符串中不能有回車符,要在字符串包含回車需要使用轉(zhuǎn)義字符\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、undefined、NaN等以外的數(shù)據(jù)都是表示真。
if(0||""||false||null||undefined||NaN)alert("有一個條件返回true了");
布爾常量只有false及true,F(xiàn)alse及True不是常量。
4、對象類型
javascript是基于對象的語言,對象是其核心。
程序流程控制
順序結(jié)構(gòu)
if條件選擇語句
switch選擇語句
while循環(huán)語句
do while語句
for循環(huán)語句
break與continue語句
for...in循環(huán)語句
for(變量 in 集合或?qū)ο?
{
執(zhí)行語句塊
}
<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);
邏輯運算符
&&
邏輯與,當左右兩邊操作數(shù)都為true時,返回值為true,否則返回false。
邏輯或,當左右兩邊操作數(shù)都為false時,返回其中第一個不為false的值或者false。
!
邏輯非,當操作數(shù)為true時,返回值為false,否則返回true。
注意:
在邏輯運算中,0、""、false、null、undefined、NaN均表示false。
函數(shù)的定義及調(diào)用
定義一個函數(shù)的格式如下:
function 函數(shù)名(參數(shù)列表)
{
程序代碼
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));
對函數(shù)進行調(diào)用的幾種方式:
函數(shù)名(傳遞給函數(shù)的參數(shù)1,傳遞給函數(shù)的參數(shù)2,….)
變量 = 函數(shù)名(傳遞給函數(shù)的參數(shù)1,傳遞給函數(shù)的參數(shù)2,….)
對于有返回值的函數(shù)調(diào)用,也可以在程序中直接使用返回的結(jié)果,例如:alert("sum=“ + square(2,3));
不指定任何函數(shù)值的函數(shù),返回undefined。
函數(shù)的參數(shù)可變性(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個。通過函數(shù)對象的length可以返回函數(shù)希望提供的參數(shù)個數(shù)。
函數(shù)參數(shù)的可變性
function add(s,b){
if(s)alert(“第一個參數(shù)是:”+s);
if(!b)alert(“沒有第二個參數(shù)!”);
else alert(“第二個參數(shù)是:”+b);
}
arguments
Arguments是一個類似數(shù)組但不是數(shù)組的對象,說它類似數(shù)組是因為其具有數(shù)組一樣的訪問性質(zhì)及方式,可以由arguments[n]來訪問對應的單個參數(shù)的值,并擁有數(shù)組長度屬性length。
如何寫一個方法,能實現(xiàn)任意多個數(shù)的求和?
alert(sum(1,2,3));//輸出6
alert(sum(100,200,500,900));//輸出1700
使用Function類創(chuàng)建函數(shù)
創(chuàng)建動態(tài)函數(shù)的基本語法格式:
var varName = new Function(argument1,...,lastArgument);
說明:
所有的參數(shù)都必須是字符串型的,最后的參數(shù)必須是這個動態(tài)函數(shù)的功能程序代碼。
例子:
<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>
多想一想:
動態(tài)函數(shù)有什么作用,在什么情況下用動態(tài)函數(shù)。
閉包(closure)
Javascript閉包就是在另一個作用域中保存了一份它從上一級函數(shù)或作用域取得的變量(鍵值對),而這些鍵值對是不會隨上一級函數(shù)的執(zhí)行完成而銷毀。
這樣在執(zhí)行完var c=a()后,變量c實際上是指向了函數(shù)b,b中用到了變量i,再執(zhí)行c()后就會彈出一個窗口顯示i的值(第一次為1)。這段代碼其實就創(chuàng)建了一個閉包,為什么?因為函數(shù)a外的變量c引用了函數(shù)a內(nèi)的函數(shù)b,就是說:
當函數(shù)a的內(nèi)部函數(shù)b被函數(shù)a外的一個變量引用的時候,就創(chuàng)建了一個我們通常所謂的“閉包”。
function a() {
var i = 0;
function b() {
alert(++i);
}
return b;
}
var c = a();
c();
閉包的作用就是在a執(zhí)行完并返回后,閉包使得Javascript的垃圾回收機制GC不會收回a所占用的資源,因為a的內(nèi)部函數(shù)b的執(zhí)行需要依賴a中的變量。
函數(shù)的作用域及this
1、在函數(shù)或方法中可以使用this來引用函數(shù)所在的當前對象
2、當沒有明確指定函數(shù)的當前對象時,作用域為window
3、可以使用call及apply來動態(tài)改變函數(shù)執(zhí)行的作用域
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變量的作用域是在定義時決定而不是執(zhí)行時決定,也就是說詞法作用域取決于源碼,編譯器通過靜態(tài)分析就能確定,因此詞法作用域也叫做靜態(tài)作用域(static scope)。但需要注意,with和eval的語義無法僅通過靜態(tài)技術(shù)實現(xiàn),所以只能說javascript的作用域機制非常接近詞法作用域(lexical scope).
javascript引擎在執(zhí)行每個函數(shù)實例時,都會創(chuàng)建一個執(zhí)行環(huán)境(execution context)。執(zhí)行環(huán)境中包含一個調(diào)用對象(call object)
調(diào)用對象是一個scriptObject結(jié)構(gòu)(scriptObject是與函數(shù)相關(guān)的一套靜態(tài)系統(tǒng),與函數(shù)實例的生命周期保持一致),用來保存內(nèi)部變量表varDecls、內(nèi)嵌函數(shù)表funDecls、父級引用列表 upvalue等語法分析結(jié)構(gòu)(注意varDecls和funDecls等信息是在語法分析階段就已經(jīng)得到,并保存在語法樹中。函數(shù)實例執(zhí)行時,會將這些信息從語法樹復制到scriptObject上)。
apply and call:它們的作用都是將函數(shù)綁定到另外一個對象上去運行,兩者僅在定義參數(shù)方式有所區(qū)別:
apply(thisArg,argArray);
call(thisArg[,arg1,arg2…] ]);
即所有函數(shù)內(nèi)部的this指針都會被賦值為thisArg,這可實現(xiàn)將函數(shù)作為另外一個對象的方法運行的目的。
apply的說明
如果 argArray 不是一個有效的數(shù)組或者不是 arguments 對象,那么將導致一個 TypeError。如果沒有提供 argArray 和 thisArg任何一個參數(shù),那么 Global 對象將被用作 thisArg,并且無法被傳遞任何參數(shù)。
call的說明
call 方法可將一個函數(shù)的對象上下文從初始的上下文改變?yōu)橛?thisArg指定的新對象。如果沒有提供 thisArg參數(shù),那么 Global 對象被用作 thisArg
重點(the point):
應用call和apply還有一個技巧在里面,就是用call和apply應用另一個函數(shù)(類)以后,當前的函數(shù)(類)就具備了另一個函數(shù)(類)的方法或者是屬性。
在瀏覽執(zhí)行的javascript中,默認情況下對象的作用域為window。
c.run();
window.c.run();
JavaScript中的系統(tǒng)函數(shù)(Global類)
encodeURI及encodeURIComponent方法
返回對一個URI字符串編碼后的結(jié)果。
decodeURI及decodeURIComponent()方法
將一個已編碼的URI字符串解碼成最初始的字符串并返回。
parseInt方法
將一個字符串按指定的進制轉(zhuǎn)換成一個整數(shù),語法格式為:parseInt(numString, [radix])。如果沒有指定第二個參數(shù),則前綴為 ‘0x' 的字符串被視為十六進制,前綴為 ‘0' 的字符串被視為八進制,所有其他字符串都被視為是十進制。
parseFloat方法
將一個字符串轉(zhuǎn)換成對應的小數(shù)。
isNaN方法
用于檢測parseInt和parseFloat方法的返回值是否為NaN。
escape方法
返回對一個字符串進行編碼后的結(jié)果字符串。所有空格、標點、重音符號以及任何其他非 ASCII 字符都用 %xx 編碼替換,其中xx等于表示該字符的Unicode編碼的十六進制數(shù),字符值大于255的字符以%uxxxx格式存儲。
unescape 方法
將一個用escape方法編碼的結(jié)果字符串解碼成原始字符串并返回。
eval 方法
將其中的參數(shù)字符串作為一個JavaScript表達式執(zhí)行。
JavaScript的內(nèi)部類
動態(tài)對象
使用“對象實例名.成員”的格式來訪問其屬性和方法。
靜態(tài)對象
直接使用“對象名.成員”的格式來訪問其屬性和方法。
Object類(對象)
Number類(對象)
String類 (對象)
Math類(對象)
Date類(對象)
toString方法
Object類
Object類是所有javascript類的基類,提供了一種創(chuàng)建自定義對象的簡單方式,不需要程序員再定義構(gòu)造函數(shù)。
主要屬性:
constructor-對象的構(gòu)造函數(shù)
prototype-獲得類的prototype對象,static性質(zhì)
主要方法:
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類代表數(shù)據(jù)類,包含一些靜態(tài)的成員及數(shù)值處理的方法。
靜態(tài)屬性:
MAX_VALUE、MIN_VALUE、NEGATIVE_INFINITY、POSITIVE_INFINITY、NaN
主要方法:
toFixed(n)-取小數(shù)位數(shù),自動四舍五入
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方法
注意:返回的結(jié)果是字符的unicode編碼。
concat方法,連接字符串
indexOf方法及l(fā)astIndexOf方法
match、search方法
replace、split方法
slice方法
說明:str1.slice(0)和str1.slice(0,-1)都是返回整個字符串。
substr、substring方法
substring方法返回的內(nèi)容不包含結(jié)束位置的字符。
toLowerCase、toUpperCase 方法
Math類
屬性:
E,代表數(shù)學常數(shù)e,約等于 2.718。
LN10,代表10的自然對數(shù),約等于 2.302。
LN2,代表2的自然對數(shù),約等于 0.693。
PI,代表數(shù)學常數(shù)∏的值,約等于 3.14159。
SQRT1-2,代表2 的平方根分之一,約等于0.707。
SQRT2,代表2 的平方根,約等于1.414。
方法:
abs方法,返回數(shù)字的絕對值。
sin、cos方法,分別返回數(shù)字的正弦、余弦值。
asin、acos方法,分別返回數(shù)字的反正弦、反余弦值。
random方法,返回介于 0 和 1 之間的偽隨機數(shù)
Math對象是一個靜態(tài)類,不能使用new關(guān)鍵字創(chuàng)建對象實例,應直接使用“對象名.成員”的格式來訪問其屬性或方法,例如,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對象實例代表的時間為止的毫秒數(shù)。
<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>
構(gòu)造方法 :Date()、Date(dateVal) 、Date(year, month, date[, hours[, minutes[, seconds[,ms]]]])
parse方法,分析一個表示日期時間的字符串,返回它所表示的時間值,該值以自1970年1月1日0點0分0秒算起的毫秒值表示。parse方法屬于一個靜態(tài)方法 。
toString方法
toString 方法是JavaScript中的所有內(nèi)部對象的一個成員方法,它的主要作用就是將對象中的數(shù)據(jù)轉(zhuǎn)換成某種格式的字符串來表示,具體的轉(zhuǎn)換方式取決于對象的類型。
舉例:
<script language="javascript">
var x = 328;
alert("hex=“ + x.toString(16) + " bin=“ + x.toString(2));
</script>
Array類
三種構(gòu)造方法:
Array()
Array(4)
Array(3.5,"abc",3)
數(shù)組排序例子:
<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-獲得數(shù)組的長度;
concat-連接數(shù)組;
join-把數(shù)組轉(zhuǎn)換成字符串;
pop-彈出一個元素;
push-放入一個元素;
reverse-顛倒數(shù)據(jù)中的元素順序;
shift-移出第一個元素;
slice-截取數(shù)組;
sort-排序數(shù)組;
unshift-在前面追加元素;
用對象的方式實現(xiàn)數(shù)組
<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、工廠方法-使用new Object創(chuàng)建對象并添加相關(guān)屬性;
2、使用構(gòu)造函數(shù)來定義類。
3、使用prototype
4、構(gòu)造函數(shù)及原型混合方式
5、動態(tài)原型方式
實例
Car類(對象)
屬性:
color-顏色
doors-門的個數(shù)
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 用來把任意數(shù)字轉(zhuǎn)換為undefined。
var d=new Object();
alert(void(d));
運用場景:
<a href=”javascript:window.open(‘a(chǎn)bout:blank')”>Click Me</a>
類的修改
1、prototype詳解
2、給已有類添加新方法
3、重新定義類的方法
4、超級后置綁定
prototype是Function對象的一個屬性,當我們訪問對象的一個成員時,先在對象內(nèi)部找,如果找不到,則到對象所在類的prototype對象中找。
封裝
封裝:封裝,也就是把客觀事物封裝成抽象的類,并且類可以把自己的數(shù)據(jù)和方法只讓可信的類或者對象操作,對不可信的進行信息隱藏。
javascript中,通過閉包可以實現(xiàn)封裝,看代碼例子。
涵蓋了javascript公有成員定義、私有成員定義、特權(quán)方法定義的簡單示例!
<script>
//定義一個javascript類
function JsClass(privateParam/* */,publicParam){//構(gòu)造函數(shù)
var priMember = privateParam; //私有變量
this.pubMember = publicParam; //公共變量
//定義私有方法
function priMethod(){
return "priMethod()";
}
//定義特權(quán)方法
//特權(quán)方法可以訪問所有成員
this.privilegedMethod = function(){
var str = "這是特權(quán)方法,我調(diào)用了\n";
str += " 私有變量:" + priMember +"\n";
str += " 私有方法:" + priMethod() +"\n";
str += " 公共變量:" + this.pubMember +"\n";
str += " 公共方法:" + this.pubMethod();
return str;
}
}
//添加公共方法
//不能調(diào)用私有變量和方法
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公有成員定義、私有成員定義、特權(quán)方法定義的簡單示例!
<script>
//定義一個javascript類
function JsClass(privateParam/* */,publicParam){//構(gòu)造函數(shù)
var priMember = privateParam; //私有變量
this.pubMember = publicParam; //公共變量
//定義私有方法
function priMethod(){
return "priMethod()";
}
//定義特權(quán)方法
//特權(quán)方法可以訪問所有成員
this.privilegedMethod = function(){
var str = "這是特權(quán)方法,我調(diào)用了\n";
str += " 私有變量:" + priMember +"\n";
str += " 私有方法:" + priMethod() +"\n";
str += " 公共變量:" + this.pubMember +"\n";
str += " 公共方法:" + this.pubMethod();
return str;
}
}
//添加公共方法
//不能調(diào)用私有變量和方法
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>
繼承
面向?qū)ο缶幊?(OOP)語言的一個主要功能就是“繼承”。繼承是指這樣一種能力:它可以使用現(xiàn)有類的所有功能,并在無需重新編寫原來的類的情況下對這些功能進行擴展。
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的方法.
對象冒充可以實現(xiàn)多重繼承 例如
function classz(){
this.newMethod = classX;
this.newMethod();
delete this.newMethod;
}
但是如果classX和classY有相同的屬性或者方法,classY具有高優(yōu)先級.
繼承-call方法
call方法使與經(jīng)典的對象冒充法就相近的方法,它的第一個參數(shù)用作this的對象,其他參數(shù)都直接傳遞給函數(shù)自身.
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個參數(shù),一個用作this對象,一個使傳遞給函數(shù)的參數(shù)數(shù)組.
function sayName(perfix) {
alert(perfix+this.name);
}
obj= new Object();
obj.name="hero";
sayName.aplly(obj,new Array("hello,") );
繼承-原型鏈
prototype對象的任何屬性和方法都會被傳遞給對應類的所有實例,原型鏈就是用這種方式來顯現(xiàn)繼承.
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的方法
這里需要注意 調(diào)用classA的構(gòu)造函數(shù)時,沒有給它傳遞參數(shù),這是原型鏈的標準做法,確保函數(shù)的構(gòu)造函數(shù)沒有任何參數(shù).
并且 子類的所有屬性和方法,必須出現(xiàn)在prototype屬性被賦值后,應為在它之前賦的值會被刪除.因為對象的prototype屬性被替換成了新對象,添加了新方法的原始對象將被銷毀.
繼承-混和方式
就是用冒充方式 定義構(gòu)造函數(shù)屬性,用原型法定義對象方法.
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的構(gòu)造函數(shù)中通過調(diào)用call方法 繼承classA中的name屬性,用原型鏈來繼承classA的showName方法.
javascript中的方法重載探討
方法重載(overloading)及覆蓋(overriding)
Javascript 中的方法本身就是一個帶可變參數(shù)的,不支持重載操作。但我們可以在方法體內(nèi)自由檢測方法的參數(shù)情況,來實現(xiàn)重載的效果。(使用可變參數(shù)或arguments 來模擬重載的示例)。
覆蓋,也稱為改寫,就是指子類中定義的方法替換掉父類的方法
javascript中多態(tài)性(polymorphisn)探討
多態(tài)性(polymorphisn):是允許你將父對象設(shè)置成為和一個或更多的他的子對象相等的技術(shù),賦值之后,父對象就可以根據(jù)當前賦值給它的子對象的特性以不同的方式運作。簡單的說,就是一句話:允許將子類類型的指針賦值給父類類型的指針。多態(tài)是為了實現(xiàn)另一個目的——接口重用!多態(tài)的作用,就是為了類在繼承和派生的時候,保證使用“家譜”中任一類的實例的某一屬性時的正確調(diào)用。
var a=[a1,a2,a3];
相關(guān)文章
JavaScript 設(shè)計模式學習 Singleton
JavaScript設(shè)計模式學習 Singleton2009-07-07- new fun的執(zhí)行過程分析,學習面向?qū)ο蟮呐笥芽梢詤⒖枷隆?/div> 2010-08-08
XRegExp 0.2: Now With Named Capture
XRegExp 0.2: Now With Named Capture...2007-11-11javascript面向?qū)ο缶幊檀a,學習js面向?qū)ο缶幊痰呐笥芽梢詤⒖枷隆?/div> 2011-12-12最新評論