JS面向對象(1) -- 簡介,入門,系統常用類,自定義類,constructor,typeof,instanceof,對象在內存中的表現形式


相關鏈接:

JS面向對象(1) -- 簡介,入門,系統常用類,自定義類,constructor,typeof,instanceof,對象在內存中的表現形式

JS面向對象(2) -- this的使用,對象之間的賦值,for...in語句,delete使用,成員方法,json對象的使用,prototype的使用,原型繼承與原型鏈

JS面向對象(3) -- Object類,靜態屬性,閉包,私有屬性, call和apply的使用,繼承的三種實現方法

1、發展史

  面向機器

  面向過程:將程序的執行分解成若干個步驟

  面向對象:將程序的執行分解成若干個事物

 

2、面向對象兩個基本概念

類:代表某類事物,是抽象的

對象:代表某個事物,是具體的

 

3、快速入門

表達一個人的完整信息

 1 <script>
 2     
 3     //面向過程
 4     var name = 'zhangsan';
 5     var age = 30;
 6     var marry = true;
 7     alert(name + age + marry);
 8     
 9     //面向對象
10     function Person{
11     }
12     var p1 = new Person();
13     p1.name = 'lisi';
14     p1.age = 20;
15     p1.marry = true;
16     alert(p1.name + p1.age + p1.marry);
17     
18 </script>

在面向過程的例子中,我們分別使用了三個變量來定義一個人的完整信息,但這三個變量它們之間沒有必然的聯系,如:我現在找到變量age,雖然可以取到數據,但並不清楚這是“誰”的年齡。

在面向對象的例子中, function Person{}是構造器。我們可以這樣理解,每一個定義的function Person{}都是Person類的構造函數。

 

4.JS中常見的系統類

1)String類 字符串類

length :取得字符串長度                        

indexOf(string) :取得參數在字符串中出現的位置

substr(num1,[num2]) :截取字符串

toLowerCase()       :轉換為小寫    

toUpperCase() :轉換為大寫    

replace(str1,str2) :字符串替換

2)Date類   日期類

getYear()        :返回年份(有時會出錯,建議用第二種)

getFullYear()  :返回年份  

getMonth()     :返回月份 (0---11)    

getDate()       :返回每月第幾天      

getDay()         :返回星期數 (0-6)

getHours()      :返回小時數

getMinutes()   :返回分鍾數

getSeconds() :返回秒數

getMilliseconds() :返回毫秒數

3)Math類  數學類

ceil(數值)       :返回大於或等於該數的最小整數(比如說分頁 Math.ceil(4.8)=5)

floor(數值)     :返回小於或等於該數的最大整數

min(數值1,數值2) :返回最小數

max(數值1,數值2) :返回最大數

pow(數值1,數值2) :返回數值1的數值2次方

random()              :返回隨機數  0----------1

round(數值)   :四舍五入

sqrt(數值)      :開平方根

Math類下的方法都是靜態方法

 

5.自定義類--類的定義

語法:

function 類名(){

}

在js中,沒有類的定義語句,只有function,每一個function,我們可以認為它是同名類的構造函數

比如說:

function person(){

它是Person類的構造函數 

這種函數也叫構造器

 

6.自定義類--聲明對象

語法: var 對象=new 類名();

關鍵字new:實例化對象, 開辟相應內存空間

1 function Person(){
2     alert('hello');
3 }
4 var p1 = new Person();

執行上面這個例子時,我們發現,在實例化時,直接執行了Person構造函數

 

7.自定義類--關於對象屬性的使用

語法:

  對象.屬性;

  對象['屬性'];

1 function Person(){
2     alert('hello');
3 }
4 var p1 = new Person();
5 p1.name='zhangsan';
6 p1.age=30;
7 alert(p1.name+p1.age);

在js中,對象屬性是動態添加的,對象屬性可以使用“.”或['']這兩種形式表示出來

對象的屬性可以是任何數據類型,如:字符串、數字、對象

 

8.三個關鍵字

constructor: 返回的是對象的構造器

typeof :返回數據類型

instanceof :判斷對象是否是某個類的實例

 1 function Person(){
 2     alert('hello');
 3 }
 4 var p1 = new Person();
 5 p1.name='zhangsan';
 6 p1.age=30;
 7 alert(p1.name+p1.age);
 8 
 9 //返回p1對象的構造器
10 alert(p1.constructor);
11 //取得p1變量的數據類型
12 alert(typeof p1);
13 //判斷p1是不是Person類的一個實例
14 alert(p1 instanceof Person);

 

9.對象在內存中的表現形式

1 //例1
2 function Person(){
3 }
4 var p1 = new Person();
5 p1.name='zhangsan';
6 p1.age=30;
7 
8 var p2 = new Person();
9 alert(p2.name);

在例1中,創建p1對象時,會為p1開辟相應的堆空間,然后將name和age屬性以及值添加到p1所指向的堆空間中,創建p2對象時,也會為p2對象開辟對應的空間,但p2所指向的堆空間是空的,所以P2對象沒有name和age屬性。

 1 //例2
 2 function Person(){
 3 }
 4 var p1 = new Person();
 5 p1.name = 'zhangsan';
 6 p1.age = 30;
 7 
 8 var p2 = p1;
 9 alert(p2.name);
10 p2.name = 'lisi';
11 alert(p2.name);
12 alert(p1.name);

在例2中,將p1棧中保存的堆的地址賦值給了p2,所以說,p2也指向了p1指向的堆內存的地址。兩個對象指向了同一塊堆內存,所以改變一個對象的屬性,會影響到另一個對象。

 1 //例3
 2 function Person(){
 3 }
 4 var p1 = new Person();
 5 p1.name = 'zhangsan';
 6 p1.age = 30;
 7 
 8 var p2 = p1;
 9 alert(p2.name);
10 p2 = null;
11 alert(p1.name);
12 alert(p2.name);

在例3中,P2=null; 表示釋放p2所占的棧空間,但p1的空間仍保留,p1仍然指向相應的堆空間,所以刪除p2不會影響到p1對象。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM