理解對象屬性
????????面向?qū)ο笳Z言的標志是都有類的概念但是js沒有類這個概念,因此它的對象和基于類的語言中的對象有所不同。
? ? ? ? 創(chuàng)建對象的方法:
var person = new Object();
person.name = "sulishi";
ES6簡潔方法:允許在對象中只寫屬性名,不寫屬性值這個時候?qū)傩灾稻褪菍傩悦淼淖兞?/p>
var foo =‘bar’
var baz = {foo};
屬性(property)類型
1.數(shù)據(jù)屬性
? ? ? ? ·[[Configurable]]:表示能否用delect刪除屬性或是能否修改屬性特性默認值為true
? ? ? ? ·[[Enumberable]]:能否通過for-in返回屬性 默認true
? ? ? ? ·[[Writable]]:能否修改屬性的數(shù)據(jù)值,默認undefined
? ? ? ? ·[[Value]]:包含這個屬性的數(shù)據(jù)值默認undefined
要修改屬性默認的特性必須用
Object.defineProperty()//vue的數(shù)據(jù)雙向綁定的核心也是這個
IE8是第一個實現(xiàn)object.definpProperty()方法的瀏覽器,但是有很多bug不建議在這個里面使用
2.訪問器屬性
? ? ·[[Get]]:讀取屬性時調(diào)用的函數(shù) 默認undefined·
? ? ·[[Set]]:寫入屬性時調(diào)用的函數(shù)? 默認undefined
訪問器屬性不能直接定義,必須使用和上面一樣的方法
eg:
var book = {
_year: 2004,
edition: 1
};
Object.defineProperty(book, "year", {
get: function(){
return this._year;
},
set: function(newValue){
if (newValue > 2004) {
this._year = newValue;
this.edition += newValue - 2004;
????????????}
????????}
????????});
book.year = 2005;
alert(book.edition); //2
get 和 set不一定非得同時指定getter和setter,只指定getter然意味著屬性是不能寫的
object.defineProperties()
利用這個方法可以通過描述符一次定義多個屬性。這個方法接收兩個對象參數(shù):第一個對象是要添加和修改其屬性的對象,第二個對象的屬性與第一個對象中要添加或修改的屬性一一對應(yīng)。
Object.getOwnPropertyDescriptor()
可以取得給定屬性的描述符。這個方法接收兩個參數(shù):屬性所在的對象和要讀取其描述符的屬性名稱。返回值是一個對象,如果是訪問器屬性,這個對象的屬性有 configurable、enumerable、get 和 set;如果是數(shù)據(jù)屬性,這個對象的屬性有 configurable、enumerable、writable 和 value。
工廠模式,構(gòu)造函數(shù)模式
原型模式
? ? 1.理解原型對象
? ? ? ? 只要創(chuàng)建新函數(shù),就會根據(jù)特定的規(guī)則給該函數(shù)創(chuàng)建一個prototype屬性,指向函數(shù)的原型對象。默認所有原型對象都會自動獲得一個constructor屬性

實現(xiàn)原型鏈基本模式


call(),apply()
·call(xx)傳遞參數(shù)進行繼承
淺復(fù)制,深復(fù)制