JS面向對象之特性已經值類型與複合類型
一些屬性
- 空對象
- 空對象也是對象, 只是有存變量的變量名, 沒有對象屬性
var o ={};
- 參數傳遞
- 值類型: 函數內外兩個變量, 兩個數據, 都不相同
- 引用類型: 函數內外變量不一樣, 一個數據, 相同地址
賦值
var num =123;
var num2 = num;
值類型的賦值特色
- 將變量內的數據所有拷貝一份, 賦值的變量
var num = 123
表示變量中存儲中的數字是 123
- 將 123 數據拷貝一份, 內存中有 2 個數據
- 將拷貝數據複製給
num2
- 特色是在內存中有2個數據副本
引用(複合)類型賦值
var o ={ name :'張三'};
var obj = o;
- 引用類型賦值就是將變量 o 中存儲的數據拷貝一份( 地址 ), 而後將數據賦值給obj
- 內存中只有1份數據
- 特色是兩個變量,一個數據,指向同一個地址
深拷貝與淺拷貝( 保證對象的屬性也是引用類型 )
-
深拷貝的概念數組
- 拷貝的時候, 將數據中的全部引用類型的值, 所有拷貝一份, 數據在內存中獨立, 就是深拷貝
- 修改拷貝數據和源數據, 沒有聯繫
- 特色: 內存隔離,徹底獨立
-
淺拷貝的概念函數
- 拷貝的時候, 只針對當前對象的屬性進行拷貝, 而引用類型不考慮
對象的動態特性
-
在 js 中, 一個對象須要屬性, 就能夠利用 對象.屬性名 = 值
的方式, 爲這個對象添加成員, 只要賦值成功, 對象就增長了新的屬性this
- 想要添加方法, 就添加方法
- 想要添加屬性, 就添加屬性
- 想要移除屬性或方法, 使用
delete
-
對象屬性的訪問形式spa
- 點語法:
o.name
- 關聯數組:
o[name]
-
混入方法( extend )code
function extend(o1, o2){
for(var key in o2){
o1[key]= o2[key];
}
}
- 若是須要給對象動態添加成員, 必須使用關聯數組語法
var o ={
name :'張三',
sayHello :function(){
console.log('Hello, 我叫'+this.name );
}
}
console.log( o.name );// 訪問的是 o 的name 屬性
console.log( o['name']);
o.sayHello();
o['sayHello'];// []中的是字符串
參數傳遞
- 做爲函數中的參數, 就是將參數的數據複製一份, 傳遞給函數的形參
function foo(num){}
var a =123;
foo(a);
* 函數在調用的時候, 首先須要將參數中的數據複製一份, 數字 123 複製一份
* 跳轉到函數中, 完成形參賦值, num = 123;
* 進入函數體, 執行每一句函數
- 值類型做爲函數參數傳遞的特徵, 函數內與函數外是兩個不一樣的變量, 只是值相等
- 引用類型做爲函數參數傳遞的特徵, 函數內與函數外是兩個不一樣的變量, 可是是指向相同得自, 指向同一個對象
構造函數
構造函數的做用
- new 的做用, 初始化數據
- 在 js 給對象添加屬性時, 使用對象的動態特性結合this(這裏this指的是使用構造函數建立的實例對象), 來進行賦值, 添加成員
構造函數建立對象的過程
- 代碼:
var 五類= new Person();
- 使用 new 建立一個對象, 它相似於
o = {}
, 是一個沒有任何成員的空對象
- 使用 new 建立對象, 對象的類型就是建立他的構造函數名
- 使用 {} 建立對象, 至關於使用
new Object
, 他的類型都是 Object
- 調用構造函數, 建立實例對象, 初始化成員
- 構造函數在調用的一開始, 有一個賦值操做, this指向剛剛創造錯來的實例對象(引用地址)
- 隱藏在構造函數中this表示剛剛建立出來的對象
- 在構造函數中使用this結合對象的動態特性, 爲實例對象添加成員