es6之Object擴展及內部屬性的總結


對象擴展:

1、Object.is(A,B) :比較兩個值是否相等,取代===運算;只要值相等代表相等;其中NAN和NAN相等;+0和-0不相等;

2、Object.assign(target,source1,source2.......) :合並源對象的所有可枚舉屬性到目標對象;同名屬性后覆蓋前;just one obj,return this obj;【僅一個參數】將源目標非對象先轉化為對象,無法轉化的將會報錯undefined;null;【多個參數】不在首參數為數值、字符串、布爾值、undefined、null均不會復制;只拷貝源對象的自身屬性,不拷貝繼承屬性;【淺拷貝】

注意⚠️:Object.assign處理數組,相同下標的元素后者覆蓋前者

    對於取值函數的合並,會先求取值之后合並;取值函數get foo(){return 1} -> foo:1

    es6規定:class的原型均為不可枚舉

使用:

/**
* 為對象添加屬性
*/
class Untils {
constructor(x, y) {
Object.assign(this, x, y) // 通過Object.assign方法將x,y添加到Untils的實例上
}
}
/**
* 為對象添加方法
*/
Object.assign(someClass.prototype, {
method(x, y) {},
anotherMethod() {}
})
/**
* 克隆對象
*/
function clone(origin) {
return Object.assign({}, origin)
}
/**
* 合並多個對象
*/
(target, ...source) => Object.assign(target, ...source)
/**
* 為屬性指定默認值
*/
const defaultOpts = {
level: 3,
color: red
}
function addOpts (opt) {
return Object.assign({},defaultOpts,opt) // defaultOpts引用類型有問題
}
3、Object.keys 遍歷對象可枚舉的屬性的鍵名,返回數組;不含繼承的屬性、不含symbol屬性【es5】取代for...in
4、Object.values 遍歷對象可枚舉的屬性的鍵值,返回數組;不含繼承的屬性、不含symbol屬性 配合for...of使用
5、Object.entries 遍歷對象可枚舉的屬性的鍵值對,返回數組;不含繼承的屬性、含symbol屬性的將忽略當前鍵值對 配合for...of使用
6、Object.getOwnPropertyDescriptor方法是為了解決Object.assign對get set函數的拷貝值問題,set get無return的情況下,Object.assign拷貝的值為undefined
7、Object.defineProperties(obj,objProperty,DescriptorObj) 修改對象屬性默認特性【數據屬性】的特定方法【es5】obj屬性所在對象,屬性名稱,屬性的描述符對象
8、Object.setPrototypeOf 取代_proto_對原型的處理【寫】
9、Object.getPrototypeOf 取代_proto_對原型的處理【讀】
10、Object.create 取代_proto_對原型的處理【生成操作】方法創建一個新對象, 使用現有的對象來提供新創建的對象的__proto__Object.create({},obj)第二個obj是添加到新創建對象上面的可枚舉屬性,同時可配置描述符對象 詳細可點擊此鏈接查看https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/create
11、super指向當前對象的prototype對象,只能用於對象的方法之中而不能用於對象方法的賦值操作【待總結繼承時詳述】
解構賦值:要求等號右邊為對象,不能為undefined/null,解構賦值的參數需作為最后一位參數;對復合類型僅作為引用;
擴展運算符: ... 相當於Object.assign 取出參數對象的所有可遍歷屬性拷貝到當前對象之中;
12、Object.hasOwnProperty 用於判斷屬性是來自對象本身,而不是通過繼承自原型鏈

對象的內部屬性:這些特性是為了實現javascript引擎

Descriptor:描述對象【每個對象都有】通過Object.getOwnPropertyDescriptor(obj,'someProperty') 訪問

數據屬性:如下【還有一種是防問器屬性】

enumerable: false 不可枚舉

configurable: true 屬性修改,可delete,修改為false之后無法再改變此描述符,再次修改 static mode會報錯

writable:true 修改屬性值
value 讀取/寫入新值 默認undefined

[[PrimitiveValue]] :原始值

_proto_ 用來讀取及設置當前屬性的prototype對象【IE11】在無法使用的內部屬性時,es6提供了可供使用的對prototype的操作方法以上6、7、8


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM