摘要:返回值為所創建的新對象例如是什么怎么使用可以列舉一個的實際應用嗎可以直接在一個對象上定義或修改屬性,并返回該對象。該方法返回值被用作屬性值。
大概會用一個系列,講一下面試過程中經常會問的一些問題,以及我覺得應該可以怎么回答。
當然,我的回答也并不是標準答案,只是我自己的一些理解,也歡迎其他人發表自己的想法。
作為本系列的第一篇文章,就先講講被問的最多的 js 繼承問題,但是應該不會寫原型鏈相關的東西,
先列舉一個最簡單的問題:
寫一個 inherit(superClass, subClass) 方法,實現subClass 繼承 superClass題目隱含的內容
繼承有哪些特征,如何檢測一個繼承是否成功?
子類可以使用父類的方法和屬性
子類可以自定義方法和屬性,但應該不影響父類和其他繼承同一個父類的子類
子類的原型鏈上可以找到父類(子類的__proto__應指向父類)
子類的實例可以通過 foo instanceof superClass 測試
常見的解法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 }引申的問題:
Object.create 是什么?怎么使用?
Object.create(proto, [propertiesObject])
Object.create 提供了一個創建對象的方法,使用現有的對象作為新創建對象的__proto__,同時可以傳入添加到新對象的可枚舉屬性, 這些屬性可以對應到Object.defineProperties 的第二個參數中。
返回值為所創建的新對象.
例如:
s.prototype = Object.create(f.prototype, { constructor: { value: s, enumberable: false, writealble: true, configurale: true } })
Object.defineProperties 是什么?怎么使用?可以列舉一個 Object.definProperties 的實際應用嗎?
Object.defineProperties可以直接在一個對象上定義或修改屬性,并返回該對象。
例如:
target = Object.defineProperties(target, props)
本質上 Object.defineProperties 是對Object.defineProperty 的集中調用,可以理解為是Object.definePeropety的復數版。
Object.defineProperty 的使用方法為:
target = Object.defineProperty(target, prop, descriptor)
所以本質上Object.defineProperties 就是如下代碼:
Object.keys(props).forEach(function (prop) { let descriptor = props[prop] Object.defineProperty(target, prop, descriptor) })
其中 descriptor 的可選值有以下集中:
configurable: 當且僅當該屬性的 configurable 為 true 時,該屬性描述符才能夠被改變,同時該屬性也能從對應的對象上被刪除。默認為 false。
enumerable: 當且僅當該屬性的enumerable為 true 時,該屬性才能夠出現在對象的枚舉屬性中。默認為 false。
value: 該屬性對應的值。可以是任何有效的 JavaScript 值(數值,對象,函數等)。默認為 undefined
writable: 當且僅當該屬性的writable為true時,value才能被賦值運算符改變。默認為 false。
get: 一個給屬性提供 getter 的方法,如果沒有 getter 則為 undefined。該方法返回值被用作屬性值。默認為 undefined。
set: 一個給屬性提供 setter 的方法,如果沒有 setter 則為 undefined。該方法將接受唯一參數,并將該參數的新值分配給該屬性。默認為 undefined。
如果一個 descriptor 不具有 value, writebale, get 和 set 任意一個關鍵字,那么將會被認為是一個數據描述符。
如果一個描述符同時具有(value或writbale)和(get 或set),將會產生一個異常.
繼承多個父類怎么做?
繼承多個父類的話,可以使用 Object.assign 方法。
例如:
targe = Object.assign({}, superClassA, superClassB, ...)
但是繼承多個父類的話,子類就不能通過 son instanceof superClass 這樣的驗證了.
Object.assign 是什么?怎么用?用的時候有哪些需要注意?
Object.assign 方法用于將所有可枚舉屬性從一個或多個源對象復制到目標對象,并返回目標對象,例如:
target = Object.assign(target, source)
如果具有同名屬性,那么在后面對象中的屬性,將會覆蓋目標對象中的屬性。
需要注意以下幾點:
繼承屬性和不可枚舉屬性是不能拷貝的。
原始類型會被包裝為對象,null, undefined 會被忽略,并且只有字符串的包裝對象才可能有自身可枚舉的屬性.
可以拷貝 symbol 類型的屬性
Object.assign 會調用 setter 和 getter 嗎?調用的是哪里的setter 和getter ?
Object.assign 會調用源對象的 getter,并把源對象的 getter 的返回值當做新對象的該屬性的值。
setter 則是會直接加在新創建的對象中,而不會沿用源對象的 setter.
Object.getOwnPropertyDescriptor 是什么?主要用來做什么?
Object.getOwnPropertyDescriptor 返回直到對象上一個自有屬性對應的描述符,例如:
Object.getOwnPropertyDescriptor(obj, prop)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/97497.html
摘要:醞釀許久之后,筆者準備接下來撰寫前端面試題系列文章,內容涵蓋瀏覽器框架分鐘搞定常用基礎知識前端掘金基礎智商劃重點在實際開發中,已經非常普及了。 這道題--致敬各位10年阿里的前端開發 - 掘金很巧合,我在認識了兩位同是10年工作經驗的阿里前端開發小伙伴,不但要向前輩學習,我有時候還會選擇另一種方法逗逗他們,拿了網上一道經典面試題,可能我連去阿里面試的機會都沒有,但是我感受到了一次面試1...
摘要:函數式編程前端掘金引言面向對象編程一直以來都是中的主導范式。函數式編程是一種強調減少對程序外部狀態產生改變的方式。 JavaScript 函數式編程 - 前端 - 掘金引言 面向對象編程一直以來都是JavaScript中的主導范式。JavaScript作為一門多范式編程語言,然而,近幾年,函數式編程越來越多得受到開發者的青睞。函數式編程是一種強調減少對程序外部狀態產生改變的方式。因此,...
閱讀 2373·2021-11-22 14:56
閱讀 1180·2019-08-30 15:55
閱讀 3211·2019-08-29 13:29
閱讀 1360·2019-08-26 13:56
閱讀 3500·2019-08-26 13:37
閱讀 566·2019-08-26 13:33
閱讀 3354·2019-08-26 13:33
閱讀 2235·2019-08-26 13:33