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


相關鏈接:

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

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

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

1.this的使用

核心:在js中,this表示當前對象,“誰”調用了當前函數,“this”就指向了“誰”

語法:

Function 類(){

this.屬性=值;

}

例1.在構造器中,使用this為當前對象添加屬性

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

創建的這兩個對象,它們的屬性是一樣的,但值也是相同的。

例2.使用this為構造函數傳參

1 function Person(p_name,p_age){
2     this.name = p_name;
3     this.age = p_age;
4 }
5 var p1 = new Person('zhangsan',30);
6 var p2 = new Person('lisi',20);
7 
8 alert(p1.name + p1.age);
9 alert(p2.name + p2.age);

在構造器中定義形參,實例化對象時,通過構造函數傳參傳遞數據。

關於this的深入理解:函數是由對象調起來的,在函數中的this就指向了這個對象。所有函數都是面向對象調用,普通函數的調用是由window對象調用的。

 

2.對象之間的賦值

對象之間的賦值都是按地址進行傳遞的。

第一種:將對象作為參數傳遞

1 function Person(p_name,p_age){
2     this.name = p_name;
3     this.age = p_age;
4 }
5 function display(obj){
6     alert(obj.name + obj.age);
7 }
8 var p1 = new Person('zhangsan',30);
9 display(p1);

第二種:將對象作為返回值返回(好處:返回多個值)

 1 function Person(p_name,p_age){
 2     this.name = p_name;
 3     this.age = p_age;
 4 }
 5 function display(){
 6     var p1 = new Person('zhangsan',30);
 7     return p1;
 8 }
 9 var per=display();
10 alert(per.name+per.age);

 

3.for...in語句

解決問題:我們在程序中,接受參數或返回值之后,我們通過for...in語句遍歷取得當前對象的所有屬性

1 function Person(p_name,p_age,p_email){
2     this.name = p_name;
3     this.age = p_age;
4     this.email = p_email;
5 }
6 var p1 = new Person('zhangsan',30,'ls@163.com');
7 for (var i in p1){
8     document.write(i + ':' + p1[i] + '<br>');
9 }

結果:name:zhangsan  age:30  email:ls@163.com

for...in語句不僅可以遍歷自定義對象,也可以遍歷系統對象。

 

4.delete的使用

delete的主要功能:刪除屬性

比如說,程序中有一個對象,我們在對其進行取值之后,如果不想保留這個對象中的某個屬性,可以使用delete將其清除

 1 function Person(p_name,p_age,p_email){
 2     this.name = p_name;
 3     this.age = p_age;
 4     this.email = p_email;
 5 }
 6 var p1 = new Person('zhangsan',30,'ls@163.com');
 7 delete p1.name;
 8 for (var i in p1){
 9     document.write(i + ':' + p1[i] + '<br>');
10 }

結果:age:30  email:ls@163.com

注意:delete只能刪除自定義對象屬性,不能刪除系統對象的屬性。

 

5.成員方法

例如:在實例化對象的同時,讓其自動擁有某些方法

 1 function Person(p_name,p_age){
 2     this.name = p_name;
 3     this.age = p_age;
 4     this.say=function(){
 5         alert(this.name + this.age);
 6     }
 7 }
 8 var p1 = new Person('zhangsan',30);
 9 var p2 = new Person('lisi',20);
10 p1.say();
11 p2.say();

關於成員方法在內存中的表現形式:用p1來舉例,p1和p1指向堆內存的地址保存在棧內存當中;堆內存當中,保存着[name:zhangsan]和[age:30]以及[say:指向代碼段的地址];代碼段中保存着say的function(){...}。

 

6.json對象的使用

背景:首先js中的對象是指屬性的無需集合(一個對象是有若干個屬性構成的),所謂“集合”是指“名/值”對的集合(js中,可以使用{}來表示這個集合)。

語法:json對象{屬性名:屬性值,屬性名:屬性值,屬性名:屬性值......}

1 //定義一個json對象
2 var p1 = {name:'zhangsan',age:30,email:'zs@163.com'};
3 var p2 = {'name':'zhangsan','age':30,'email':'zs@163.com'};
4 var p3 = {"name":'zhangsan',"age":30,"email":'zs@163.com'};
5 
6 //使用json對象
7 alert(p1.name+p1.age+p1.email);
8 alert(p2.name+p2.age+p2.email);
9 alert(p3.name+p3.age+p3.email);

定義json對象的屬性時,可以使用三種格式:Name, 'Name', "Name"。json是Object類下的一個對象。

 1 //定義json數組來保存多個人的信息
 2 var per = [
 3     {name:'zhangsan',age:30,email:'zs@163.com'},
 4     {'name':'zhangsan','age':30,'email':'zs@163.com'},
 5     {"name":'zhangsan',"age":30,"email":'zs@163.com'}
 6     ];
 7 
 8 //遍歷json數組
 9 for (var i=0;i<per.length;i++){
10     document.write(per[i].name+':'+per[i].age+'<br>');
11 }

通過構造器得到一個對象與使用json來創建對象的特點:

使用json創建對象省略了構造器的定義,一般用與只需要一個對象

使用構造器可以簡化屬性的定義,需要多個相同屬性或方法的對象

json的成員方法:為json對象添加一個屬性,屬性值是一個函數

1 var json = {name : 'zhangsan',say:function(){
2     alert(this.name);
3 }};
4 json.say();

php中處理json的方式:

生成json:String json_encode($obj|$row)

解析json:json_decode($jsonstr,$flag) [注: true:解析到數組中  false:解析到對象中  默認:false]

 

7.prototype的使用

功能:返回對象類原型的引用

格式:class.prototype

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

在例1中,我們利用prototype為Person類下的所有對象添加一個叫age的屬性和speak方法。注意的是,Person.prototype.age和Person.age是有區別的。Person.prototype.age是指為Person類下的實例添加age屬性,而Person.age是指為Person類添加的靜態屬性。

原理:JS底層在加載Person構造器的時候,會生成一個與之對應的,完全獨立的Person原型對象。 在Person構造器內有一個prototype的屬性。在Person原型對象里面有一個constructor屬性。Person構造器下的prototype指向Person原型對象,Person原型對象下的constructor指向Person構造器。

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

結果:第一個彈出10,第二個彈出30。p1.age相當於為p1對象動態添加了一個叫age的屬性。但沒有改變Person原型對象中的值。

 

8.原型繼承與原型鏈

所有類的父類都是Object類。

原型是一個對象,它是Object類下的一個實例。當系統為Person構造器創建原型對象時,JS會執行:Person.prototype = new Object();。所以Object類下的所有屬性和方法會被這個原型對象所擁有。Person下的實例就可以通過這個原型對象使用這些屬性和方法。這也是Object是所有類的父類的原因。

1 function Person(p_name){
2     this.name = p_name;
3 }
4 Object.prototype.age = 30;
5 Object.prototype.speak=function(){
6     alert(this.name+this.age);
7 }
8 var p1 = new Person('zhangsan');
9 p1.speak();

原型鏈的舉例:Person原型對象也是對象,當這個對象找不到某個屬性時,會找到Object構造器的原型對象中去找,這個就是原型鏈。

 


免責聲明!

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



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