JavaScript面向對象編程指南 PDF書簽版 http://www.linuxidc.com/Linux/2016-04/130052.htm
對象(名詞):是指“事物”在程序設計語言中的表現形式。
這裡的事物可以是任何東西,我們可以看到它們具有某些明確特征,能執行某些動作。
這些對象特征就叫做屬性(形容詞),動作稱之為方法(動詞)。
類:實際上就是對象的設計藍圖或制作配方。類更多的是一種模板,而對象就是在這些模版的基礎上被創建出來的。
封裝:主要闡述對象中包含的內容。通常包括:
聚合:將幾個現有對象合並成一個新對象的過程
繼承:實現代碼重用
多態:不同對象通過相同的方法調用來實現各自行為的能力
2e+3表示在數字2後面加3個0,即2000
typeof Infinity // number
typeof NaN // number
typeof null // object null值表示一個空指針對象
Javascript引擎在一個邏輯表達式中遇到一個非布爾類型操作數,
那麼該操作數的值就會成為該表達式返回的結果。
true || "something" //true
true && "something" //"something"
var s = "1s"; //隱式轉換Number()用於任何數據類型
s++ //NaN
10 % "0" //NaN 如果被除數是有限大的數值而除數是零,則結果是NaN
//乘法口訣程序代碼
for(var i=1;i<10;i++){
for(var j=1;j<=i;j++){
document.write(j+"*"+i+"="+i*j+" ");
}
document.write("<br>");
}
函數內部都有一個內建的arguments數組,能返回函數所接收的所有參數
functionsumOnSteroids(){
var i,res = 0;
for(i = 0; i < arguments.length; i++){
res += arguments[i];
}
return res;
}
sumOnSteroids(1,2,3,4,5,6); //21
var a = 123;
functionf(){
alert(a); //undefined 這是因為函數域優先於全局域
var a = 1;
alert(a); //1
}
f();
當我們將函數B傳遞給函數A,並由A來執行B時,B就成了一個回調函數
functionA(a,b,c,callback){
var i=0,ar = [];
for(i=0;i<3;i++){
ar[i] = callback(arguments[i]*2);
}
return ar;
}
functionB(a){ //回調函數
return a+1;
}
A(a,b,c,B)
(function(name){
alert('Hello '+name+' !');
})('Jesse') //Hello Jesse !
//第二對括號起到的是立即調用的作用,同時也是向函數傳遞參數的地方
使用自調函數的好處是不會產生任何全局變量,缺點是無法重復執行,這使得匿名自調函數最合適於執行一些一次性的或者初始化的任務
functiona(param){
functionb(theinput){ //私有函數
return theinput * 2
};
return 'The result is '+b(param)
}
使用私有函數的好處:
這對於要執行某些一次性初始化工作的函數非常有用
functiona(){
alert('A'); //第一次調用該函數時該語句會被執行
a = function(){ //第一次調用時a被賦予新函數
alert('B'); //第二次調用該函數時該語句會被執行
};
}
var a = function(){
functionsomeSetup(){
var setup = 'done'
}
functionactualWork(){
alert('work')
}
someSetup();
return actualWork;
}();
在函數內定義的變量在函數外是不可見的,
但是如果該變量是在某個代碼塊中定義的(if或for語句中),它在代碼塊外是可見的。
在javascript中每個函數都有一個屬於自己的詞法作用域,也就是說每個函數
在被定義時(而非執行時)都會創建一個屬於自己的環境(即作用域)
functionf1(){var a = 1;f2();}
functionf2(){return a;} //f2()被定義時a是不可見的,只能訪問自身作用域和全局作用域
f1(); //a is not defined
functionf(){
var b = "m";
return function(){ //有著私有作用域,可以訪問f()的作用域和全局作用域
return b;
}
}
var n = f();
n(); //m
f()是全局函數,我們可以將它的返回值賦值給另一個全局變量,
從而生成一個可以訪問f()私有空間的新全局函數
如果一個函數在其父函數返回之後想留住對父級作用域的鏈接,就必須要為此建立一個閉包
functionf(){
var a = [];
for(var i = 0; i < 3; i++){
a[i] = function(){
return i;
}
}
return a;
}
var s = f();
s[0](); //3
s[1](); //3
s[2](); //3
我們在這裡創建了3個閉包,它們都指向一個共同的局部變量i,
但是閉包不會記錄它們的值,他們所擁有的只是一個i的引用,
因此只能返回i的當前值(循環結束時i=3).
functionf(){
var a = [];
for(var i = 0; i < 3; i++){
a[i] = (function(x){
return function(){
return x;
}
})(i);
}
return a;
}
var s = f();
s[0](); //0
s[1](); //1
s[2](); //2
1.十六進制值轉為顏色函數getRGB()
functiongetRGB(hex){
var rgb=[0,0,0];
if(/#(..)(..)(..)/g.test(hex)){
rgb=[parseInt(RegExp.$1,16),parseInt(RegExp.$2,16),parseInt(RegExp.$3,16)];
};
return "rgb("+rgb.join(",")+")";
}
getRGB('#00ff00'); //"rgb(0,255,0)"
用[]定義數組的方法我們稱之為數組文本標識法
用{}定義對象的方法我們稱之為對象文本標識法
在javascript中我們用數組表示索引型數組,用對象表示關聯型數組
一般通過以下兩種方式訪問對象的屬性:
functionHero(name){ //構造器函數首字母大寫
this.name = name;
this.occupation = 'ninja'
}
var hero = new Hero('jesse'); //使用new操作符創建新對象
hero.name; //ninja
使用構造器函數的好處是能利用同一個構造器函數通過傳參從而創建出不同的對象。
事實上程序所在的宿主環境一般都會為其提供一個全局對象,
而所謂的全局變量其實只不過是該對象的屬性
構造器屬性實際上是一個指向用於創建該對象的構造器函數的引用
hero.contructor //Hero
通過instanceof操作符,我們可以測試一個對象是不是由某個指定的構造器函數所創建的
hero instanceof Hero; //true
引用類型,因為其值大小不固定,因此棧內存中存放的只是該對象的訪問地址,(即該對象的引用)
堆內存為這個值分配空間。因此我們在引用上所做的任何改動,都會影響到他所引用的源對象。
所有對象都繼承自Object對象,因此都具有toLocaleString()、toString()和valueOf()方法。
var o = new Object();
var o = {};
alert(o); //[object,Object]
由於alert()要接收字符串參數,所以它會在後台調用toString()方法
Object構造器的成員:
用Object()構造器所建對象的成員:
var a = new Array();
var a = [];
typeof a; //'object' 數組也是對象
值得關注的數組的屬性與方法
Array對象的成員:
函數實際上也是一種對象,函數對象的內建構造器是Function()
定義函數的三種方式:
function sum(a,b){return a + b;}; //函數聲明
var sum = function(a,b){return a + b;}; //函數表達式
var sum = new Function('a','b','return a + b;'); //Function構造器 避免使用
caller:返回一個調用該函數對象的外層函數引用
functionA(){return A.caller;}
functionB(){return A();}
B(); //function B(){return A();}
Function對象繼承自Object對象,默認擁有Object對象的所有方法
call()、apply()方法都能讓對象去借用其他對象中的方法為己所用,這也是一種代碼重用的方式。
call()方法:
var someObj = {
name: 'Ninja',
say: function(who){
return 'Hello '+who+', my name is '+ this.name;
}
};
var myObj = {
name:'Jesse'
};
someObj.say.call(myObj, 'Dude');//"Hello Dude, my name is Jesse"
//當say()被調用時其中的this就被自動設置成myObj對象的引用
如果我們調用call方法時需要傳遞更多的參數,可以在後面依次加入他們
someObj.say.call(myObj,'a','b','c')
如果我們沒有將對象傳遞給call()的首參數,或者傳遞的是null,則它的調用對象默認為全局對象
someObj.say.apply(myObj,['a','b','c'])
通過arguments.callee屬性實現匿名函數的遞歸調用
(function(count){
if(count < 5){
console.log(count);
arguments.callee(++count);
}
})(1) //1,2,3,4
Function對象的成員
var b = new Boolean();
typeof b; //'object'
typeof b.valueOf();// 'boolean'
Number對象的toString()方法有一個可選的radix參數(默認10)
var n =new Number(255);
n.toString(16); // 'ff'
Number()構造器的成員
Number對象的成員
當我們將一個基本字符串當做對象來使用時,後台會執行相應的String對象創建操作
String()構造器的成員
String對象的成員
更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2016-04/130053p2.htm