JS對(duì)象屬性的繼承與遍歷

創(chuàng)建對(duì)象foo,并在其原型上聲明屬性x,enumerable值為true,value值為1。

function foo(){}

Object.defineProperty(foo.prototype,'x',{enumerable: true, value: 1});


用?Object.create(object)?創(chuàng)建對(duì)象obj,使其原型指向?qū)ο骹oo的實(shí)例,打印obj發(fā)現(xiàn)是空對(duì)象,但是打印obj.x卻有值。這是為什么呢?其實(shí)一開(kāi)始先在自身查找是否存在指定屬性,沒(méi)有的話會(huì)繼續(xù)往上找,也就是在原型上找,找到則停止,找不到最后則返回null。

我們也可以用?Object.hasOwnProperty(prop)?查看對(duì)象自身屬性中是否具有指定的屬性,如果在對(duì)象自身則返回true,反之返回false。

ps:in操作符能找到原型鏈上的屬性。

var obj = Object.create(new foo());

console.log(obj);? ? ? ? ????//foo {}

console.log(obj.x);? ? ?????//1

console.log('x' in obj);? ? //true

console.log(obj.hasOwnProperty('x')); ???? //false


1、對(duì)象屬性的繼承。

下面的實(shí)例修改之后x的值還是為1,原因是在foo原型定義的x的writable默認(rèn)為false,即只能讀取,不能修改。

console.log(obj.x);? ? ? ? //1

obj.x = 5;? ? ? ? ? ? ? ? ? ? ? //修改x的值

console.log(obj.x);? ? ? ?//1

我們重新修改一下原型的x屬性,可以看到這次x變成5了,不過(guò)他只是在自身創(chuàng)建了個(gè)x屬性,不用原型的x了,我們可以通過(guò)obj.hasOwnProperty('x')知道,然后delete掉對(duì)象自身的x,再打印,x為原型上的屬性,值為1,這就是原型鏈的繼承。我們可以繼承原型上的屬性,同時(shí)也不會(huì)修改到它。

Object.defineProperty(foo.prototype,'x',{enumerable: true, writable: true, value: 1});

console.log(obj.x);? ? ? ? //1

obj.x = 5;? ? ? ? ? ? ? ? ? ? ? //修改x的值

console.log(obj.x);? ? ? ?//5

delete obj.x;? ? ? ? ? ? ? ? //這里刪除自身的x

console.log(obj.x);? ? ? //這里是原型上的x



2、對(duì)象屬性的遍歷

用?Object.defineProperties(obj,props)?在對(duì)象obj上定義新的屬性name和type。

ps: enumerable:是否可遍歷,由于type上設(shè)置了false,所以后面遍歷的時(shí)候沒(méi)有打印type

Object.defineProperties(obj , {

? ? ? ? name: {value: 'Ann', enumerable: true},

? ? ? ? type: {value: 'Object', enumerable: false, writable: true}

});

用Object.keys()和for...in...遍歷查看obj的鍵名,比較一下這兩種方法

Object.keys(obj)? ? ? ? ? ? ? ? ? ? ? ?//["name"]

for(var key in obj){

? ? ? ? console.log(key);? ? ? ? ? ? ? // name,x

}

為什么兩種寫(xiě)法結(jié)果不同呢?

Object.keys()只能遍歷對(duì)象自身的屬性,

for...in...能遍歷原型上面擴(kuò)展的屬性,并且順序不確定,在使用時(shí)得注意!

我們可以用Object.hasOwnProperty(prop) 加個(gè)判斷,改寫(xiě)一下for...in...,讓他只能遍歷自身的屬性。

for(var key in obj){

? ? ? ? if(obj.hasOwnProperty(key)){

? ? ? ? ? ? console.log(key);? ? ? ? //name

? ? ? ? }

? ? }

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容