ES6學(xué)習(xí)教程之對(duì)象的擴(kuò)展詳解
一、 屬性的簡(jiǎn)潔表示法
ES6允許直接寫(xiě)入變量和函數(shù)作為對(duì)象的屬性和方法。意思就是說(shuō)允許在對(duì)象中只寫(xiě)屬性名,不用寫(xiě)屬性值。這時(shí),屬性值等于屬性名稱(chēng)所代表的變量。下面分別舉一個(gè)例子來(lái)說(shuō)明:
屬性:
function getPoint(){
var x = 1 ;
var y = 2;
return {x,y}
}
等同于
fucntion getPoint(x,y){
var x = 1 ;
var y = 2;
return {x:x,y:y}
}
測(cè)試:
getPoint();//{x:1,y:10}
函數(shù):
var obj = {
fun(){
return "simply function";
}
};
等同于
var obj = {
fun: function(){
return "simply function";
}
}
測(cè)試:
obj.fun();//simply function
二、屬性名表達(dá)式
ES6里允許定義對(duì)象的時(shí)候用表達(dá)式作為對(duì)象的屬性名或者方法名,即把表達(dá)式放在方括號(hào)里。
屬性
let propKey = 'foo';
let obj = {
[propKey] : true,
['a'+'bc'] : 123
}
測(cè)試:
obj.foo; //true obj.abc ; //123
方法
let obj = {
['h'+'ello'](){
return "hello world";
}
}
測(cè)試:
obj.hello();//hello world
注意:
屬性名表達(dá)式與簡(jiǎn)介表達(dá)式不能同時(shí)使用。
//錯(cuò)誤的
var foo = 'bar';
var bar = 'abc';
var baz = { [foo] };
//正確
var foo = 'bar';
var baz = { [foo] : 'abc'}
三、方法的name屬性
這個(gè)比較容易理解,直接闡述文字。
函數(shù)的name屬性返回函數(shù)名。對(duì)象方法也是函數(shù),因此也有函數(shù)名。
- 一般情況方法的name屬性返回函數(shù)名
- 如果是取值函數(shù)會(huì)在函數(shù)名前加”get”
- 如果是存值函數(shù)會(huì)在函數(shù)名前加”set”
- 如果bind方法創(chuàng)建的函數(shù)會(huì)在函數(shù)名前加”bound”
- 如果是Function構(gòu)造函數(shù)創(chuàng)建的函數(shù),會(huì)在函數(shù)名前加”anonymous”
- 如果對(duì)象的方法是一個(gè)Symbol值,那么name屬性返回的是這個(gè)Symbol值的描述*
四、Oject.is()
Object.is()用來(lái)比較兩個(gè)值yan'ge嚴(yán)格相等。與嚴(yán)格比價(jià)運(yùn)算符(===)的行為基本一致。不同之處只有兩個(gè):一是 +0 不等于 -0 ,二是NaN等于自身
+0 === -0 //true NaN === NaN //false Object.is(+0,-0);//false Object.is(NaN,NaN);//true
五、Oject.assign()
Object.assign()方法是用于將源對(duì)象的可枚舉屬性復(fù)制到目標(biāo)對(duì)象。它至少需要兩個(gè)參數(shù),第一是目標(biāo)對(duì)象,后面的全是源對(duì)象。
注意:
- 每個(gè)參數(shù)必須是對(duì)象,否則會(huì)報(bào)TypeError錯(cuò)誤。
- 如果目標(biāo)對(duì)象與源對(duì)象有同名屬性,或多個(gè)源對(duì)象有同名的屬性,則后面的屬性會(huì)覆蓋前面的屬性
Object.assign只復(fù)制自身屬性,不可枚舉的屬性和繼承屬性不會(huì)被復(fù)制- 屬性名為Symbol值的屬性,也會(huì)被Object。assign復(fù)制。
demo:
var target = {a:1,b:2};
var source1 = {a:2,c:5};
var source2 = {a:3,d:6};
Object.assign(target,source1,source2);
target//{a:3,b:2,c:5,d:6}
Object.assign可用于處理數(shù)組,但是會(huì)將其視為對(duì)象
Object.assign([1,2,3],[4,5]); //[4,5,3]
其他用處
- 為對(duì)象添加屬性
- 為對(duì)象添加方法
- 克隆對(duì)象
- 合并多個(gè)對(duì)象
- 為屬性指定默認(rèn)值
六、屬性的可枚舉性
對(duì)象的沒(méi)個(gè)屬性都有一個(gè)描述對(duì)象(Descriptor),可通過(guò)Object.getOwnPropertyDescriptor(object,prop) ,object表示對(duì)象,prop表示對(duì)象的里的一個(gè)屬性,用的時(shí)候需要加上引號(hào)。描述對(duì)象里面有個(gè)enumerable(可枚舉性)屬性,來(lái)描述該屬性是否可枚舉。
ES5中會(huì)忽略enumerable為false的屬性
for…in循環(huán):只遍歷對(duì)象自身和繼承的可枚舉屬性(包含繼承)Object.keys():返回對(duì)象自身的所有可枚舉屬性的鍵名Json.stringify():只串行化對(duì)象自身的可枚舉屬性
ES6新增的操作
Object.assign(): 只復(fù)制對(duì)象自身的可枚舉屬性Reflect.enumerate(): 返回所有for…in循環(huán)會(huì)遍歷的屬性(包含繼承)
7. 屬性的遍歷
ES6中一共有6種方法可以遍歷對(duì)象的屬性。
for…in循環(huán)遍歷對(duì)象自身和繼承的可枚舉的屬性(不含Symbol屬性)Object.keys(obj)返回一個(gè)數(shù)組,包括對(duì)象自身的(不含繼承的)所有可枚舉屬性(不含Symbol屬性,但是包含不可枚舉屬性)Object.getOwnPropertySymbols(obj)返回一個(gè)數(shù)組,包含對(duì)象自身的所有Symbol屬性。Relect.ownKeys(obj)返回一個(gè)數(shù)組,包含對(duì)象的所有屬性,包含屬性名是Symbol或者字符串,也不管是否可枚舉。Reflect.enumerate(obj)返回一個(gè)Iterator對(duì)象,遍歷對(duì)象自身的和繼承的所有可枚舉屬性(不含Symbol),與for…in相同
以上6種方法遍歷對(duì)象的屬性遵守同樣的屬性遍歷次序規(guī)則
- 首先遍歷所有屬性名為數(shù)值的屬性,按照數(shù)字排序
- 其次遍歷所有屬性名為字符串的屬性,按照生成時(shí)間排序
- 最后遍歷所有屬性名為Symbol值的屬性,按照生成時(shí)間排序
Reflect.ownkeys({[Symbol()]:0,b:0,10:0,2:0,a:0})
//[‘2','10','b','a',Symbol()]
八、 proto 屬性,Object.setPrototypeOf(),Object.getPrototypeOf()
proto 屬性
(前后應(yīng)該有兩個(gè)下劃線(xiàn),這里沒(méi)顯示出來(lái))。用來(lái)讀取或者設(shè)置當(dāng)前對(duì)象的prototype對(duì)象。但是一般不直接對(duì)這個(gè)屬性進(jìn)行操作,而是通過(guò)Object.setProtortypeOf() (寫(xiě)操作)、Object.getPrototypeOf() (讀操作)或者Object.create() (生成操作)代替。
Object.setProtortypeOf()
let proto = {};
let obj = { x : 10};
Object.setProtortypeOf(obj,proto);
proto.y = 20;
proto.z = 40;
obj.x //10
obj.y //20
obj.z //40
Object.getProtortypeOf()
function Rectangle(){}
var rec = new Rectangle();
Object.getPrototypeOf(rec) === Rectangele.prototype // true
9. 對(duì)象的擴(kuò)展運(yùn)算符
ES7中提案,將rest參數(shù)/擴(kuò)展運(yùn)算符(…)引入對(duì)象。
Rest參數(shù)
Rest參數(shù)用于從一個(gè)對(duì)象取值,相當(dāng)于將所有可遍歷尚未被讀取的屬性,分配到制定的對(duì)象上。所有的鍵及其值都會(huì)復(fù)制到新對(duì)象上。需要注意的是rest參數(shù)的復(fù)制是淺復(fù)制,并且也不會(huì)復(fù)制繼承自原型對(duì)象的屬性。
簡(jiǎn)單的demo
let {x,y,...k} = {x:2, y:3,z:4,a:5};
x //2
y //3
k //{z:4,a:5}
擴(kuò)展運(yùn)算符
擴(kuò)展運(yùn)算符用于取出參數(shù)對(duì)象的所有可遍歷屬性,復(fù)制到當(dāng)前對(duì)象中。
let z = {a:3 ,b:4};
let n = {...z};
n //{a:3,b:4}
擴(kuò)展運(yùn)算符還可以合并兩個(gè)對(duì)象。
let a = { c:5,d:6 };
let b = { e:7,f:8 };
let ab = {...a,...b};
ab //{c:5,d:6,e:7,f:7}
擴(kuò)展運(yùn)算符還可以自定義屬性,會(huì)在新對(duì)象中覆蓋掉原有參數(shù)。
let a = {x:1,y:2};
let aWithOverides = {...a,x:3,y:4};
aWithOverides //{x:4,y:4}
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
- ES6數(shù)組與對(duì)象的解構(gòu)賦值詳解
- ES6新特性六:promise對(duì)象實(shí)例詳解
- ES6中定義類(lèi)和對(duì)象的方法示例
- ES6 迭代器與可迭代對(duì)象的實(shí)現(xiàn)
- ES6知識(shí)點(diǎn)整理之對(duì)象解構(gòu)賦值應(yīng)用示例
- ES6 Promise對(duì)象概念與用法分析
- ES6學(xué)習(xí)筆記之字符串、數(shù)組、對(duì)象、函數(shù)新增知識(shí)點(diǎn)實(shí)例分析
- ES6學(xué)習(xí)教程之對(duì)象字面量詳解
- ES6 對(duì)象的新功能與解構(gòu)賦值介紹
- ES6 Promise對(duì)象的應(yīng)用實(shí)例分析
- JS面向?qū)ο缶幊獭狤S6 中class的繼承用法詳解
- ES6對(duì)象操作實(shí)例詳解
相關(guān)文章
javascript 通用簡(jiǎn)單的table選項(xiàng)卡實(shí)現(xiàn)
鑒于UI妹妹每次交付過(guò)來(lái)的選項(xiàng)卡都夾帶了多多少少的js,而且每遇到選項(xiàng)卡就加一點(diǎn)js,造成垃圾低劣代碼逐漸堆積過(guò)多了,一直想做一個(gè)通用簡(jiǎn)潔的選項(xiàng)卡庫(kù)。2010-05-05
一覽畫(huà)面點(diǎn)擊復(fù)選框后獲取多個(gè)id值的方法
這篇文章主要介紹了在一覽畫(huà)面點(diǎn)擊復(fù)選框后獲取多個(gè)id值的方法,前臺(tái)采用js技術(shù)后臺(tái)采用java技術(shù)實(shí)現(xiàn)的,邏輯清晰,非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友一起看看吧2016-05-05
JavaScript實(shí)現(xiàn)函數(shù)緩存及應(yīng)用場(chǎng)景
在JavaScript中,可以通過(guò)函數(shù)緩存來(lái)提高函數(shù)的執(zhí)行效率,本文就來(lái)介紹一下JavaScript實(shí)現(xiàn)函數(shù)緩存及應(yīng)用場(chǎng)景,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01
JavaScript中entries()和Object.values()方法的使用
本文詳細(xì)介紹了JavaScript中的兩個(gè)實(shí)用方法,entries()和Object.values(),下面就來(lái)介紹一下兩個(gè)方法在遍歷對(duì)象和數(shù)組時(shí)的應(yīng)用,感興趣的可以了解一下2024-12-12
Bootstrap面板(Panels)的簡(jiǎn)單實(shí)現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了Bootstrap面板(Panels)的簡(jiǎn)單實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03

