JavaScript筆記(八)

來源:互聯網
上載者:User

標籤:時機   可擴充   說明   如何   操作   父類   cal   如何使用   代碼   

自訂繼承:

1. 僅修改一個對象的父物件:
obj.__proto__=father
問題: __proto__是內部屬性,本不能直接使用。
解決:
Object.setPrototypeOf(child,father)
設定child繼承father
Object.getPrototypeOf(child)
獲得child的父物件
問題: 每次只能修改一個對象的父物件
2. 批量修改所有子物件的父物件:
修改建構函式的原型對象:
建構函式.prototype=father
時機: 在定義完建構函式後,在開始建立第一個子物件之前。
3. 兩種類型間的繼承:
  問題: 兩種類型間,有相同的屬性和方法
解決: 抽象出一個公用的父類型,集中儲存兩種類型相同的屬性結構和方法
如何?: 3步:
1. 定義父類型建構函式和原型對象
2. 在子類型建構函式中借用父類型建構函式
如何借用: call和apply
父類型建構函式.apply(this,arguments)
call和apply: 專門用於借用一個函數,並替換函數中的this為指定對象。
何時使用: 今後,只要函數中的this不是想要的,都要用call和apply更換。

相同: 借用函數,替換this
不同: call要求傳入函數的參數必須獨立傳入。
apply要求傳入函數的參數必須放入一個數組或集合中,整體傳入
如何使用:
函數.call(
替換this的對象,要傳給函數的參數)

3. 讓子類型的原型對象繼承父類型的原型對象。
Object.setPrototypeOf(
子類型的原型對象,
父類型的原型對象
);

ES5:
對象的屬性:
ES5中提供了對對象屬性的保護
命名屬性: 凡是可用.直接存取的屬性
資料屬性: 直接儲存屬性值的屬性


每個資料屬性都有四大特性:
value: 實際儲存屬性值
writable: true/false 是否可修改
enumerable:true/false 是否可遍曆
configurable:true/false


是否可修改或刪除其他特性
如何讀取一個屬性的特性:
Object.getOwnPropertyDescriptor(
obj,"屬性名稱"
)//返回一個對象,包含四大特性
特性的預設值:
用傳統方式添加的屬性,四大特性都是true。
如何設定屬性的特性:
Object.defineProperty(obj,"屬性名稱"{
特性:值,
...:...
})
問題: 任何時候都可用defineProperty將特性恢複原樣
解決: 修改特性同時,都要將configurable設定為false
configurable一旦被改為false,則無法復原。

訪問器屬性: 不直接儲存屬性值,僅提供對其他屬性的保護
內部屬性: 不允許打.直接存取的屬性
比如: class __proto__

四大特性:
get:function(){return xxx}
set:function(val){
驗證val
xxx=val
}
enumerable:
configurable:
何時使用: 只要用自訂的規則保護屬性時,都要用訪問器屬性
如何使用: 2步:
1. 定義資料屬性,實際儲存屬性值
問題: 使用者可直接操作資料屬性,而繞過訪問器屬性的保護。
解決: 閉包!
2. 定義訪問器屬性,保護資料屬性
只能用defineProperty()
Object.defineProperty(obj,"屬性名稱",{
get:function(){return xxx},
set:function(val){xxx=val},
enumerable:
configurable:
})
get/set方法都不用手動調用:
只要用訪問器屬性取值時,自動調get()
只要用訪問器屬性賦值時,自動調set()
set中的參數val,會自動獲得要賦的值
建構函式中的訪問器屬性:
鄙視: 實現一個類型,同時包含public公有屬性和private私人屬性
private私人屬性: 僅在對象內部使用的屬性,無法通過.訪問到。
public公有屬性: 直接用對象.可訪問到的屬性。

防篡改: 禁止添加,刪除,修改對象的屬性
1. 防擴充:
每個對象中,都有一個預設的內部屬性:
extensible,預設為true,說明隨時可擴充新屬性。
如果修改extensible屬性為false,則禁止擴充新屬性
如何修改:
Object.preventExtensions(obj)
阻止對obj對象的一切擴充
問題:只限制添加新屬性,不限制刪除舊屬性
2. 密封: 在防擴充的基礎上,修改所有屬性的configurable特性為false
如何密封: Object.seal(obj);
將obj對象密封
3. 凍結: 在密封基礎上,禁止修改所有屬性的值。
Object.freeze(obj);

Object.create():建立一個新對象,繼承指定的父物件,同時為新對象擴充新屬性
何時使用: 只要基於一個現有父物件,建立一個子物件時。
如何使用:
var child=Object.create(father,{
新屬性:{四大特性},
...:...
})

 

數組API: 
1. 判斷: 數組中的元素是否符合要求: 
arr.every(...):判斷arr中所有元素是否都符合要求。
arr.some(...):判斷arr中是否包含符合要求的元素。
如何使用: 
var bool=arr.every(
function(val,idx,arr){
return 判斷條件
}
);
every會用function去arr中每個元素執行檢查。只有每個元素的執行結果都為true時,才返回true。只要任意一個不返回true,則every立刻返回false。
說明: 
val: 自動獲得當前正在檢查的元素值
idx: 自動獲得當前正在檢查的元素位置
arr: 自動獲得當前正在檢查的數組對象
2.遍曆: 對數組中的每個元素執行相同個操作
arr.forEach(...):依次對arr中每個元素執行相同的操作,再儲存回原數組。
直接修改原數組
arr.map(...): 依次取出arr中每個元素的值,執行相同操作,再儲存到新數組中
不直接修改原數組,返回新數組

3.過濾和匯總:
過濾: 篩選出arr中合格元素,組成新數組。
var sub=arr.filter(function(val,idx,arr){
return 條件
})
不修改原數組。

匯總: 將當前數組中的所有元素,統計出一個結果。
var r=
arr.reduce(function(prev,val,idx,arr{
return 將val匯總到prev中的結果
},base)
依次將arr中每個值,匯總到prev中。
說明:prev獲得的是截止idx位置之前的所有元素值的臨時匯總
base,用來設定起始的匯總值。

2.bind
bind:基於一個現有函數,建立一個新函數,同時永久綁定this對象和部分參數。
為什麼:
call和apply:
臨時借用函數,替換其中的this,傳入參數。
問題: 臨時借用,臨時替換this
解決:bind
何時使用: 永久綁定this和部分參數時
如何使用:
var fun=Fun.bind(obj,參數1,參數2,...)
基於已有的Fun函數,返回一個新函數,同時永久綁定新函數中的this為obj,同時綁定部分參數值為參數1,參數2,

3. strict 模式:
啟用:程式碼片段頂部:"use strict";
2處:
1.script的開始
2.函數的開始
規則:
1. 將靜默失敗,升級為錯誤
2. 禁止對未聲明過的變數賦值
(function(){"use strict";
m=12;//報錯
})();
console.log(m);//12
3. 禁用了arguments.callee
(function(){"use strict";
argument.callee();
})();
4. 多了eval範圍
(function(){"use strict";
eval("var sum=2+3");
console.log(sum);
})()

 

JavaScript筆記(八)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.