摘要:掛在函數(shù)上的方法,稱之為靜態(tài)方法。方法返回一個(gè)由指定對(duì)象的所有自身屬性的屬性名包括不可枚舉屬性組成的數(shù)組。以上常用的方法合并或復(fù)制對(duì)象使用遍歷對(duì)象使用創(chuàng)建對(duì)象使用以上如有偏差歡迎指正學(xué)習(xí),謝謝。
內(nèi)置提供了一個(gè)對(duì)象為 Object ,也被稱之為是構(gòu)造函數(shù),用來(lái)創(chuàng)建對(duì)象用的。在 javascript 函數(shù)也是對(duì)象,是一種可被執(zhí)行的對(duì)象,所以稱Object為對(duì)象也是可以的。掛在函數(shù)上的方法,稱之為靜態(tài)方法。
Object.defineProperty()如果對(duì)這個(gè)方法不了解,必須先看,下面的某些方法要定義不可枚舉的屬性時(shí)會(huì)用到。
移步閱讀:https://segmentfault.com/a/1190000007434923Object.getOwnPropertyDescriptor()
方法返回指定對(duì)象上一個(gè)自有屬性對(duì)應(yīng)的屬性描述符。(自有屬性指的是直接賦予該對(duì)象的屬性,不需要從原型鏈上進(jìn)行查找的屬性)
屬性描述符是一個(gè)對(duì)象,記錄了此屬性,是否可被枚舉、是否可被刪除、是否可被改寫(xiě)、屬性的值。
let obj = {a:1,b:2}; console.log(Object.getOwnPropertyDescriptor(obj,"a"));
返回值是一個(gè)對(duì)象:
{ configurable: true enumerable: true value: 1 writable: true }
一般對(duì)象定義的屬性,不使用 Object.defineProperty() 定義的,都是可被枚舉、可被刪除、可被改寫(xiě)。
Object.getOwnPropertyNames()方法返回一個(gè)由指定對(duì)象的所有自身屬性的屬性名(包括不可枚舉屬性)組成的數(shù)組。
let obj = { a:1, b:2 } console.log(Object.getOwnPropertyNames(obj)); //["a","b"] Object.defineProperty(obj,"c",{ enumerable: false }) console.log(Object.getOwnPropertyNames(obj)); //["a","b","c"]Object.assign()
這個(gè)方法被經(jīng)常用到,作用是將一個(gè)或多個(gè)對(duì)象可枚舉的屬性合并到目標(biāo)對(duì)象上,返回為目標(biāo)對(duì)象。
用法:
let target = {a:1}; let t = Object.assign(target,{b:1},{c:1}) console.log(target); // {a:1,b:1,c:1} console.log(t); // {a:1,b:1,c:1} console.log(target === t); // true
通過(guò)以上測(cè)試會(huì)發(fā)現(xiàn),將多個(gè)對(duì)象的屬性都合并到了對(duì)象 target 上,并且返回的依然是對(duì)象 target。
要注意,這種方式為淺拷貝(淺復(fù)制),遇到值為對(duì)象類型時(shí),會(huì)引用相同的對(duì)象。
let target = {a:1}; let source = {b:1,users:["seven"] Object.assign(target,source) target.users.push("job"); console.log(target.users); // ["seven","job"] console.log(source.users); // ["seven","job"]
以上的屬性 users 對(duì)應(yīng)的值為數(shù)組,數(shù)組是引用類型的值,并沒(méi)有復(fù)制一份給到 target,所以對(duì)象 target 和 source 使用的是同一個(gè)對(duì)象。改變后會(huì)互相影響,如果要完全的脫離關(guān)系,可以選擇深復(fù)制,利用 jQuery 的 extend 函數(shù)。
此函數(shù)常用的應(yīng)用場(chǎng)景是覆蓋函數(shù)定義的對(duì)象默認(rèn)值,例如要封裝一個(gè) Ajax ,要傳遞很多個(gè)參數(shù),某些參數(shù)是可選的,采用傳遞一個(gè)對(duì)象的方式更利于擴(kuò)展:
function Ajax(options){ let defautls = { method:"get", data:{}, success(){}, error(){} } Object.assign(defautls,options) } Ajax({ method:"post" })
對(duì)象屬性是可選的,預(yù)先定義好默認(rèn)值,當(dāng)調(diào)用函數(shù)傳遞的屬性覆蓋掉默認(rèn)設(shè)置的屬性。
Object.create()此方法用基于傳入的參數(shù)對(duì)象作為原型來(lái)創(chuàng)建一個(gè)新對(duì)象。只能接受對(duì)象或者null作為參數(shù)。查看新對(duì)象的 proto 的值,為傳入的參數(shù)對(duì)象。
let obj = { a:1, b:2 } let newObject = Object.create(obj); console.log(newObject.__proto__ === obj); // true
以上就是把 obj 對(duì)象作為新創(chuàng)建對(duì)象的原型。
也可以傳入 null,意思是創(chuàng)建一個(gè)沒(méi)有任何原型的對(duì)象,這樣創(chuàng)建對(duì)象的方式更加高效。
應(yīng)用場(chǎng)景為原型繼承上,例如一個(gè)函數(shù)的原型需要繼承另一個(gè)原型,就可以就可以基于一個(gè)原型對(duì)象創(chuàng)建一個(gè)新的對(duì)象,把新的對(duì)象賦值給另一個(gè)原型即可。
// 父類 function Person(){} Person.prototype.say = function(){} 子類 function Coder(){} // 需要繼承父類Peroson原型對(duì)象 Coder.prototype = Object.create(Person.prototype.)Object.is
判斷值是否相同,連一個(gè)奇葩的自身和自身不相等的 NaN 都可以判斷為相同。
console.log(Object.is(1,1)); // true console.log(Object.is(NaN,NaN)); //trueObject.getPrototypeOf()
返回指定對(duì)象的原型對(duì)象,(內(nèi)部[[Prototype]]屬性的值)。[[Prototype]] 為內(nèi)部使用的,我們一般使用 proto 這個(gè)瀏覽器提供的屬性來(lái)獲取對(duì)象的原型,但在 ES5 規(guī)范中 proto 并不是標(biāo)準(zhǔn)的屬性,是瀏覽器為了方便開(kāi)發(fā)者查看對(duì)象的原型提供的,因?yàn)檫@個(gè)屬性使用起來(lái)方便,現(xiàn)在大多數(shù)瀏覽器都提供。如果要用規(guī)范方法獲取原型對(duì)象,建議使用 Object.getPrototypeOf
console.log(Object.getPrototypeOf({}) === Object.prototype); // true let obj = {a:1}; let newObj = Object.create(obj); // 基于obj為原型創(chuàng)建新的對(duì)象 console.log(Object.getPrototypeOf(newObj) === obj); // true console.log(newObj.__proto__ === Object.getPrototypeOf(newObj)); // trueObject.setPrototypeOf()
這個(gè)方法設(shè)置一個(gè)指定的對(duì)象的原型 ( 即, 內(nèi)部[[Prototype]]屬性)到另一個(gè)對(duì)象或 null。
let obj = { a:1, b:2 } console.log(Object.getPrototypeOf(obj) === Object.prototype) let newProto = { c:1 } Object.setPrototypeOf(obj,newProto); // 把obj對(duì)象的原型設(shè)置為對(duì)象newProto console.log(Object.getPrototypeOf(obj) === newProto); // trueObject.keys
方法會(huì)返回一個(gè)由一個(gè)給定對(duì)象的自身可枚舉屬性組成的數(shù)組,數(shù)組中屬性名的排列順序和使用 for...in 循環(huán)遍歷該對(duì)象時(shí)返回的順序一致 。
要注意,Object.keys 方法不能遍歷出不可枚舉的屬性,要遍歷出不可枚舉屬性,可使用 Object.getOwnPropertyNames。
let obj = { a:1, b:2 } Object.defineProperty(obj,"c",{ enumerable: false }) console.log(Object.keys(obj)); //["a","b"]Object.values
返回一個(gè)給定對(duì)象自身的所有可枚舉屬性值的數(shù)組。與使用 for...in 循環(huán)順序保持一致,但 Object.values 不遍歷原型鏈。
把對(duì)象的 value 值存放在一個(gè)數(shù)組中。
let obj = { a:1, b:2 } console.log(Object.values(obj)); //[1,2]Object.entries
返回一個(gè)給定對(duì)象自身可枚舉屬性的鍵值對(duì)數(shù)組,與使用 for...in 循環(huán)順序保持一致,但 Object.entries 不遍歷原型鏈。
let obj = {a:1,b:2}; let keyValueArr = Object.entries(obj); console.log(keyValueArr); // 打印:[["a", 1],["b", 2]]
把對(duì)象的 key 和 value 存放在同一個(gè)數(shù)組中,第一項(xiàng)為 key ,第二項(xiàng)為 value 。
這個(gè)方法常常配合 for...of 語(yǔ)法使用來(lái)遍歷對(duì)象,
let obj = {a:1,b:2}; for(let [key,value] of Object.entries(obj)){ console.log(key,value); // "a",1;"b",2 }
[key,value] 形式為解構(gòu)賦值,右側(cè) Object.entries(obj) 返回的是一個(gè)二維數(shù)組 [["a", 1],["b", 2]],這樣每次拿到數(shù)組中的一項(xiàng) ["a",1],利用解構(gòu)賦值的形式,將數(shù)組第一項(xiàng)賦值給 key,第二項(xiàng)賦值給 value。
以上常用的方法:
合并或復(fù)制對(duì)象使用Object.assgin;
遍歷對(duì)象使用 Object.keys
創(chuàng)建對(duì)象使用 Object.create
以上如有偏差歡迎指正學(xué)習(xí),謝謝。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/100599.html
摘要:如下示例構(gòu)造函數(shù)實(shí)例化對(duì)象新特性使用類實(shí)例化對(duì)象引入了類這一概念,可以通過(guò)關(guān)鍵字,定義類。否則報(bào)錯(cuò),這是類和構(gòu)造函數(shù)的一個(gè)主要區(qū)別。其實(shí),的類,可以看作是構(gòu)造函數(shù)的另外一種寫(xiě)法。 前言 類語(yǔ)法是ES6中新增的一個(gè)亮點(diǎn)特性,下文簡(jiǎn)單對(duì)類的使用進(jìn)行簡(jiǎn)要說(shuō)明(僅作為個(gè)人層面的理解) js傳統(tǒng)模式實(shí)例化對(duì)象方法——prototype 在JavaScript中,實(shí)例化一個(gè)對(duì)象的傳統(tǒng)使用方法是通過(guò)...
摘要:內(nèi)存模型指定了如何與計(jì)算機(jī)內(nèi)存協(xié)同工作。內(nèi)部的內(nèi)存模型內(nèi)存模型在內(nèi)部使用,將內(nèi)存分為了線程棧和堆。下面的圖從邏輯角度給出了內(nèi)存模型每個(gè)運(yùn)行在內(nèi)部的線程都有自己的線程棧。部分線程棧和堆可能在某些時(shí)候會(huì)占用緩存和內(nèi)部寄存器。 Java內(nèi)存模型指定了JVM如何與計(jì)算機(jī)內(nèi)存協(xié)同工作。JVM是整個(gè)計(jì)算機(jī)的模型因此這個(gè)模型包含了內(nèi)存模型,也就是Java內(nèi)存模型。 如果你像要設(shè)計(jì)正確行為的并發(fā)程序,...
摘要:目錄無(wú)繼承簡(jiǎn)單的字段聲明無(wú)繼承簡(jiǎn)單的方法聲明簡(jiǎn)單繼承一層繼承字段覆蓋無(wú)繼承靜態(tài)函數(shù)無(wú)繼承靜態(tài)變量神秘的類無(wú)繼承簡(jiǎn)單的字段聲明先來(lái)看個(gè)最簡(jiǎn)單的例子,我們僅僅使用了關(guān)鍵字并定義了一個(gè)變量最后編譯出來(lái)的代碼如下。無(wú)繼承靜態(tài)變量還有個(gè)小例子。 在[上一篇文章][]中,我們提到 ES6 的 class 語(yǔ)法糖是個(gè)近乎完美的方案,并且講解了實(shí)現(xiàn)繼承的許多內(nèi)部機(jī)制,如 prototype/__pro...
摘要:舉個(gè)栗子中一段簡(jiǎn)單的繼承代碼實(shí)現(xiàn)使用了,不會(huì)報(bào)錯(cuò)這段代碼非常簡(jiǎn)單,在子類中使用了關(guān)鍵字,編譯時(shí)不會(huì)報(bào)錯(cuò),也可以正常執(zhí)行。參考資料從中的講原型鏈與繼承的靜態(tài)屬性和實(shí)例屬性 問(wèn)題引入 最近一直在看原型繼承相關(guān)的東西,翻到這么一篇文章: 從ES6中的extends講js原型鏈與繼承 文中有一個(gè)點(diǎn)讓我很感興趣,箭頭函數(shù)在繼承過(guò)程中無(wú)法通過(guò)super關(guān)鍵字獲取,這是為什么呢? 前置知識(shí) MDN上...
摘要:對(duì)象篇簡(jiǎn)介本身就是一個(gè)函數(shù),可用于工具函數(shù),也可以是用于構(gòu)造對(duì)象的函數(shù)其次可以添加屬性和方法方法又可以分為靜態(tài)方法定義在自身上的和實(shí)例方法定義在原型上的工具函數(shù)作為工具函數(shù)參數(shù)可以是任意數(shù)據(jù)類型,將其轉(zhuǎn)為對(duì)象如果參數(shù)是空,,則將其轉(zhuǎn)換為空對(duì) 對(duì)象篇 Object簡(jiǎn)介 Object本身就是一個(gè)函數(shù),可用于工具函數(shù),也可以是用于構(gòu)造對(duì)象的函數(shù);其次Object可以添加屬性和方法;方法又可以...
閱讀 2683·2021-11-18 10:02
閱讀 3415·2021-09-28 09:35
閱讀 2594·2021-09-22 15:12
閱讀 753·2021-09-22 15:08
閱讀 3110·2021-09-07 09:58
閱讀 3475·2021-08-23 09:42
閱讀 735·2019-08-30 12:53
閱讀 2085·2019-08-29 13:51