js繼承與屬性

相關(guān)知識點(diǎn)鏈接與參考鏈接:
一篇文章理解JS繼承——原型鏈/構(gòu)造函數(shù)/組合/原型式/寄生式/寄生組合/Class extends
js繼承(原型鏈筷登、構(gòu)造魂爪、組合先舷、寄生組合)
詳解forin,Object.keys和Object.getOwnPropertyNames的區(qū)別

1.原型鏈上的屬性與對象上的屬性重名

關(guān)于對象上與原型鏈上屬性同名的情況基本介紹可以參見《JavaScript高級程序設(shè)計》P149

對象自己沒有但是從在__proto__上繼承的屬性,如果對其進(jìn)行賦值的修改,那么會在對象上添加這個屬性滓侍。但是如果不是進(jìn)行賦值的修改,那么原型鏈上的屬性被修改蒋川。

function Person() {
    this.name="Jack",
    this.friends=["friend1", "friend2", "friend3"],
    this.hobby=["hobby1","hobby2"]
}

function Student() {
}
Student.prototype = new Person()

let student1=new Student()
let student2=new Student()

student1.name="Robin"
student1.friends=[]
student2.hobby.push("hobby3")
console.log(student1.name)
console.log(student1.friends)
console.log(student1.hobby)
console.log("____________________________")
console.log(student2.name)
console.log(student2.friends)
console.log(student2.hobby)

image.png

對student1.name賦值,不會影響到student2.name也就是不會影響到原型鏈
對引用類型的student1.fridends賦值也不會影響到原型鏈
但是對引用類型student1.hobby進(jìn)行push操作就相當(dāng)于獲取到原型鏈上的hobby再對這個hobby調(diào)用函數(shù)push撩笆,所以原型鏈上的hobby改變
即使在'同名覆蓋'的原則下捺球,我們還是有可能對原型鏈上的屬性做出誤改,所以使用student.hasOwnProperty()來判斷屬性在原型鏈或者對象上就顯得尤為重要

2.for in夕冲,Object.keys和Object.getOwnPropertyNames

注意:本次討論不包括Symbol氮兵。因?yàn)镾ymbol 作為屬性名,遍歷對象的時候歹鱼,該屬性不會出現(xiàn)在for...in泣栈、for...of循環(huán)中,也不會被Object.keys()弥姻、Object.getOwnPropertyNames()秩霍、JSON.stringify()返回。

參考詳解forin蚁阳,Object.keys和Object.getOwnPropertyNames的區(qū)別
Object知識點(diǎn):js繼承實(shí)現(xiàn)之Object.create
屬性是否可枚舉铃绒、屬性描述符知識點(diǎn):讀懂屬性描述符對象的擴(kuò)展-屬性的可枚舉和遍歷

2.1 for in與Object.keys都是為屬性的是否可枚舉所服務(wù)

2.1.1 for in

for in 可以獲取對象本身螺捐、以及原型鏈上所有可枚舉的屬性颠悬。并且采用同名覆蓋矮燎,當(dāng)對象本身與原型鏈上擁有同名屬性時,僅獲取對象本身的屬性赔癌。

let parent = Object.create(Object.prototype, {
    a: {
        value: 1,
        writable: true,
        enumerable: true,
        configurable: true
    },
    b: {
        value: 1.1,
        writable: true,
        enumerable: true,
        configurable: true
    },
});
let child = Object.create(parent, {
    b: {
        value: 2,
        writable: true,
        enumerable: true,
        configurable: true
    },
    c: {
        value: 3,
        writable: true,
        enumerable: false,
        configurable: true
    }
});
for(let key in child)
{
    console.log(`key:${key},value:${child[key]}`)
}

2.1.2 Object.keys()作為for in的補(bǔ)充(也作為 Object.getOwnPropertyNames()的補(bǔ)充)

只能獲取到可枚舉诞外、在對象本身上的屬性

let parent = Object.create(Object.prototype, {
    a: {
        value: 1,
        writable: true,
        enumerable: true,
        configurable: true
    }
});
let child = Object.create(parent, {
    b: {
        value: 2,
        writable: true,
        enumerable: true,
        configurable: true
    },
    c: {
        value: 3,
        writable: true,
        enumerable: false,
        configurable: true
    }
});
console.log(Object.keys(child));

2.2 Object.getOwnPropertyNames()與是否可枚舉無關(guān),會獲得對象本身上的所有key值

let parent = Object.create(Object.prototype, {
    a: {
        value: 1,
        writable: true,
        enumerable: true,
        configurable: true
    }
});
let child = Object.create(parent, {
    b: {
        value: 2,
        writable: true,
        enumerable: true,
        configurable: true
    },
    c: {
        value: 3,
        writable: true,
        enumerable: false,
        configurable: true
    }
});
console.log(Object.getOwnPropertyNames(child));

3.Symbol作為屬性名

symbol知識點(diǎn):es6-Symbol

Symbol 作為屬性名灾票,遍歷對象的時候峡谊,該屬性不會出現(xiàn)在for...in、for...of循環(huán)中刊苍,也不會被Object.keys()既们、Object.getOwnPropertyNames()、JSON.stringify()返回正什。

但是啥纸,它也不是私有屬性,有一個Object.getOwnPropertySymbols()方法婴氮,可以獲取指定對象的所有 Symbol 屬性名斯棒。該方法返回一個數(shù)組,成員是當(dāng)前對象的所有用作屬性名的 Symbol 值主经。

const obj = {};
let a = Symbol('a');
let b = Symbol('b');

obj[a] = 'Hello';
obj[b] = 'World';

const objectSymbols = Object.getOwnPropertySymbols(obj);

objectSymbols
// [Symbol(a), Symbol(b)]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末荣暮,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子罩驻,更是在濱河造成了極大的恐慌穗酥,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鉴腻,死亡現(xiàn)場離奇詭異迷扇,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)爽哎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進(jìn)店門蜓席,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人课锌,你說我怎么就攤上這事厨内。” “怎么了渺贤?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵雏胃,是天一觀的道長。 經(jīng)常有香客問我志鞍,道長瞭亮,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任固棚,我火速辦了婚禮统翩,結(jié)果婚禮上仙蚜,老公的妹妹穿的比我還像新娘。我一直安慰自己厂汗,他們只是感情好委粉,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著娶桦,像睡著了一般贾节。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上衷畦,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天栗涂,我揣著相機(jī)與錄音,去河邊找鬼霎匈。 笑死戴差,一個胖子當(dāng)著我的面吹牛送爸,可吹牛的內(nèi)容都是我干的铛嘱。 我是一名探鬼主播,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼袭厂,長吁一口氣:“原來是場噩夢啊……” “哼墨吓!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起纹磺,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤帖烘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后橄杨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體秘症,經(jīng)...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年式矫,在試婚紗的時候發(fā)現(xiàn)自己被綠了乡摹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,625評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡采转,死狀恐怖聪廉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情故慈,我是刑警寧澤板熊,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站察绷,受9級特大地震影響干签,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜拆撼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一容劳、第九天 我趴在偏房一處隱蔽的房頂上張望丹泉。 院中可真熱鬧,春花似錦鸭蛙、人聲如沸摹恨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽晒哄。三九已至,卻和暖如春肪获,著一層夾襖步出監(jiān)牢的瞬間寝凌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工孝赫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留较木,地道東北人。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓青柄,卻偏偏與公主長得像伐债,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子致开,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,492評論 2 348