摘要:返回值為所創(chuàng)建的新對(duì)象例如是什么怎么使用可以列舉一個(gè)的實(shí)際應(yīng)用嗎可以直接在一個(gè)對(duì)象上定義或修改屬性,并返回該對(duì)象。該方法返回值被用作屬性值。
大概會(huì)用一個(gè)系列,講一下面試過(guò)程中經(jīng)常會(huì)問(wèn)的一些問(wèn)題,以及我覺(jué)得應(yīng)該可以怎么回答。
當(dāng)然,我的回答也并不是標(biāo)準(zhǔn)答案,只是我自己的一些理解,也歡迎其他人發(fā)表自己的想法。
作為本系列的第一篇文章,就先講講被問(wèn)的最多的 js 繼承問(wèn)題,但是應(yīng)該不會(huì)寫(xiě)原型鏈相關(guān)的東西,
先列舉一個(gè)最簡(jiǎn)單的問(wèn)題:
寫(xiě)一個(gè) inherit(superClass, subClass) 方法,實(shí)現(xiàn)subClass 繼承 superClass題目隱含的內(nèi)容
繼承有哪些特征,如何檢測(cè)一個(gè)繼承是否成功?
子類(lèi)可以使用父類(lèi)的方法和屬性
子類(lèi)可以自定義方法和屬性,但應(yīng)該不影響父類(lèi)和其他繼承同一個(gè)父類(lèi)的子類(lèi)
子類(lèi)的原型鏈上可以找到父類(lèi)(子類(lèi)的__proto__應(yīng)指向父類(lèi))
子類(lèi)的實(shí)例可以通過(guò) foo instanceof superClass 測(cè)試
常見(jiàn)的解法function inherit(p, s) { s.prototype = Object.create(p.prototype, { constructor: { value: s, enumerable: false, writebale: true, configurable: true } }) Object.setPrototypeOf ? Object.setPrototypeOf(s, p) : s.__proto__ = p }
function inherit(p, s) { var f = new Function () f.prototype = new p() var r = new f() s.prototype = r s.prototype.constructor = s s.__proto__ = p f = null r = null }引申的問(wèn)題:
Object.create 是什么?怎么使用?
Object.create(proto, [propertiesObject])
Object.create 提供了一個(gè)創(chuàng)建對(duì)象的方法,使用現(xiàn)有的對(duì)象作為新創(chuàng)建對(duì)象的__proto__,同時(shí)可以傳入添加到新對(duì)象的可枚舉屬性, 這些屬性可以對(duì)應(yīng)到Object.defineProperties 的第二個(gè)參數(shù)中。
返回值為所創(chuàng)建的新對(duì)象.
例如:
s.prototype = Object.create(f.prototype, { constructor: { value: s, enumberable: false, writealble: true, configurale: true } })
Object.defineProperties 是什么?怎么使用?可以列舉一個(gè) Object.definProperties 的實(shí)際應(yīng)用嗎?
Object.defineProperties可以直接在一個(gè)對(duì)象上定義或修改屬性,并返回該對(duì)象。
例如:
target = Object.defineProperties(target, props)
本質(zhì)上 Object.defineProperties 是對(duì)Object.defineProperty 的集中調(diào)用,可以理解為是Object.definePeropety的復(fù)數(shù)版。
Object.defineProperty 的使用方法為:
target = Object.defineProperty(target, prop, descriptor)
所以本質(zhì)上Object.defineProperties 就是如下代碼:
Object.keys(props).forEach(function (prop) { let descriptor = props[prop] Object.defineProperty(target, prop, descriptor) })
其中 descriptor 的可選值有以下集中:
configurable: 當(dāng)且僅當(dāng)該屬性的 configurable 為 true 時(shí),該屬性描述符才能夠被改變,同時(shí)該屬性也能從對(duì)應(yīng)的對(duì)象上被刪除。默認(rèn)為 false。
enumerable: 當(dāng)且僅當(dāng)該屬性的enumerable為 true 時(shí),該屬性才能夠出現(xiàn)在對(duì)象的枚舉屬性中。默認(rèn)為 false。
value: 該屬性對(duì)應(yīng)的值。可以是任何有效的 JavaScript 值(數(shù)值,對(duì)象,函數(shù)等)。默認(rèn)為 undefined
writable: 當(dāng)且僅當(dāng)該屬性的writable為true時(shí),value才能被賦值運(yùn)算符改變。默認(rèn)為 false。
get: 一個(gè)給屬性提供 getter 的方法,如果沒(méi)有 getter 則為 undefined。該方法返回值被用作屬性值。默認(rèn)為 undefined。
set: 一個(gè)給屬性提供 setter 的方法,如果沒(méi)有 setter 則為 undefined。該方法將接受唯一參數(shù),并將該參數(shù)的新值分配給該屬性。默認(rèn)為 undefined。
如果一個(gè) descriptor 不具有 value, writebale, get 和 set 任意一個(gè)關(guān)鍵字,那么將會(huì)被認(rèn)為是一個(gè)數(shù)據(jù)描述符。
如果一個(gè)描述符同時(shí)具有(value或writbale)和(get 或set),將會(huì)產(chǎn)生一個(gè)異常.
繼承多個(gè)父類(lèi)怎么做?
繼承多個(gè)父類(lèi)的話,可以使用 Object.assign 方法。
例如:
targe = Object.assign({}, superClassA, superClassB, ...)
但是繼承多個(gè)父類(lèi)的話,子類(lèi)就不能通過(guò) son instanceof superClass 這樣的驗(yàn)證了.
Object.assign 是什么?怎么用?用的時(shí)候有哪些需要注意?
Object.assign 方法用于將所有可枚舉屬性從一個(gè)或多個(gè)源對(duì)象復(fù)制到目標(biāo)對(duì)象,并返回目標(biāo)對(duì)象,例如:
target = Object.assign(target, source)
如果具有同名屬性,那么在后面對(duì)象中的屬性,將會(huì)覆蓋目標(biāo)對(duì)象中的屬性。
需要注意以下幾點(diǎn):
繼承屬性和不可枚舉屬性是不能拷貝的。
原始類(lèi)型會(huì)被包裝為對(duì)象,null, undefined 會(huì)被忽略,并且只有字符串的包裝對(duì)象才可能有自身可枚舉的屬性.
可以拷貝 symbol 類(lèi)型的屬性
Object.assign 會(huì)調(diào)用 setter 和 getter 嗎?調(diào)用的是哪里的setter 和getter ?
Object.assign 會(huì)調(diào)用源對(duì)象的 getter,并把源對(duì)象的 getter 的返回值當(dāng)做新對(duì)象的該屬性的值。
setter 則是會(huì)直接加在新創(chuàng)建的對(duì)象中,而不會(huì)沿用源對(duì)象的 setter.
Object.getOwnPropertyDescriptor 是什么?主要用來(lái)做什么?
Object.getOwnPropertyDescriptor 返回直到對(duì)象上一個(gè)自有屬性對(duì)應(yīng)的描述符,例如:
Object.getOwnPropertyDescriptor(obj, prop)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/97497.html
摘要:醞釀許久之后,筆者準(zhǔn)備接下來(lái)撰寫(xiě)前端面試題系列文章,內(nèi)容涵蓋瀏覽器框架分鐘搞定常用基礎(chǔ)知識(shí)前端掘金基礎(chǔ)智商劃重點(diǎn)在實(shí)際開(kāi)發(fā)中,已經(jīng)非常普及了。 這道題--致敬各位10年阿里的前端開(kāi)發(fā) - 掘金很巧合,我在認(rèn)識(shí)了兩位同是10年工作經(jīng)驗(yàn)的阿里前端開(kāi)發(fā)小伙伴,不但要向前輩學(xué)習(xí),我有時(shí)候還會(huì)選擇另一種方法逗逗他們,拿了網(wǎng)上一道經(jīng)典面試題,可能我連去阿里面試的機(jī)會(huì)都沒(méi)有,但是我感受到了一次面試1...
摘要:函數(shù)式編程前端掘金引言面向?qū)ο缶幊桃恢币詠?lái)都是中的主導(dǎo)范式。函數(shù)式編程是一種強(qiáng)調(diào)減少對(duì)程序外部狀態(tài)產(chǎn)生改變的方式。 JavaScript 函數(shù)式編程 - 前端 - 掘金引言 面向?qū)ο缶幊桃恢币詠?lái)都是JavaScript中的主導(dǎo)范式。JavaScript作為一門(mén)多范式編程語(yǔ)言,然而,近幾年,函數(shù)式編程越來(lái)越多得受到開(kāi)發(fā)者的青睞。函數(shù)式編程是一種強(qiáng)調(diào)減少對(duì)程序外部狀態(tài)產(chǎn)生改變的方式。因此,...
摘要:系列種優(yōu)化頁(yè)面加載速度的方法隨筆分類(lèi)中個(gè)最重要的技術(shù)點(diǎn)常用整理網(wǎng)頁(yè)性能管理詳解離線緩存簡(jiǎn)介系列編寫(xiě)高性能有趣的原生數(shù)組函數(shù)數(shù)據(jù)訪問(wèn)性能優(yōu)化方案實(shí)現(xiàn)的大排序算法一怪對(duì)象常用方法函數(shù)收集數(shù)組的操作面向?qū)ο蠛驮屠^承中關(guān)鍵詞的優(yōu)雅解釋淺談系列 H5系列 10種優(yōu)化頁(yè)面加載速度的方法 隨筆分類(lèi) - HTML5 HTML5中40個(gè)最重要的技術(shù)點(diǎn) 常用meta整理 網(wǎng)頁(yè)性能管理詳解 HTML5 ...
摘要:系列種優(yōu)化頁(yè)面加載速度的方法隨筆分類(lèi)中個(gè)最重要的技術(shù)點(diǎn)常用整理網(wǎng)頁(yè)性能管理詳解離線緩存簡(jiǎn)介系列編寫(xiě)高性能有趣的原生數(shù)組函數(shù)數(shù)據(jù)訪問(wèn)性能優(yōu)化方案實(shí)現(xiàn)的大排序算法一怪對(duì)象常用方法函數(shù)收集數(shù)組的操作面向?qū)ο蠛驮屠^承中關(guān)鍵詞的優(yōu)雅解釋淺談系列 H5系列 10種優(yōu)化頁(yè)面加載速度的方法 隨筆分類(lèi) - HTML5 HTML5中40個(gè)最重要的技術(shù)點(diǎn) 常用meta整理 網(wǎng)頁(yè)性能管理詳解 HTML5 ...
閱讀 2374·2021-11-22 14:56
閱讀 1181·2019-08-30 15:55
閱讀 3213·2019-08-29 13:29
閱讀 1362·2019-08-26 13:56
閱讀 3504·2019-08-26 13:37
閱讀 567·2019-08-26 13:33
閱讀 3354·2019-08-26 13:33
閱讀 2235·2019-08-26 13:33