新人學習JS的日記腐缤。
歡迎各位朋友糾錯椒惨!
以下內容都在谷歌瀏覽器進行測試可用
一些方法是ES6的,要用babel轉碼才能用(不過最新版本谷歌瀏覽器已經(jīng)支持90%的ES6語法了,基本都可以使用).
>>語法
let a = 'str' , b = function(){} , obj = {};
字面量語法
1: obj = { //直接設置屬性,方法
a: 'str',
b: function(){}
}
2: obj = {
a: a,
b: b
}
3: obj = { //ES6
a, //可以將變量,直接設置為屬性.
b,
func(arg){}, //方法可以不寫'function'關鍵字,直接寫 函數(shù)名(){};
['test' + a]: b //可以將寫動態(tài)屬性名,
get property(){}, // 直接設置geter,setter方法.
set property(val){},
}
用Object構造函數(shù)
obj = new Object([val])
1: 不寫參數(shù)或 val為null,undefined, 返回一個空對象
2: val是什么類型,返回什么類型對象.
>>靜態(tài)方法
① 創(chuàng)建對象
>> Object.assign(target, ...sources) -- 將所有源對象的可枚舉屬性,復制到目標對象.
1: target: 必填object類型的值.
2: ...sources: (多個)源對象.
3: 拷貝規(guī)則: 調用sources的[[GET]]方法 , target的[[SET]]方法 , 更像 直接賦值 而不是 復制值. 基本類型會轉換封裝類型.
4: 只拷貝sources本身的<可枚舉>的屬性,其原型鏈上的不拷貝.
5: 若target有相同的屬性(非只讀屬性),會被后來的sources的屬性覆蓋. 若屬性是只讀屬性,報錯.
6: sources為null,undefined 跳過,進行下一個.
7: 注意:拷貝為淺拷貝. 也就是說:若sources的屬性有object類型,只會復制其引用. 而不是復制一個object.
8: 返回target對象.
>> Object.create(proto, [ propertiesObject ]) -- 用原型對象(和配置屬性),創(chuàng)建一個新對象.
1: proto:一個對象,作為新對象的原型.
2: propertiesObject: 給新對象設置屬性,和具體內部配置.例如:
{ //具體看 Object.defineProperty()
'attrName' : {
value:'attrVal',
writable: true ,
set:function(val){}
}
3: proto不是null或則對象,則報錯.
4: proto是null的時候,會返回一個沒有原型的對象,也就是說該對象沒有任何屬性,方法可以調用,全部都得自己定義.
4: 返回新對象
② 遍歷對象
>> Object.keys(obj) -- 查看對象的可枚舉屬性.
1: 要查看其枚舉屬性的對象.
2: 返回對象的可枚舉屬性的字符串數(shù)組.
3: 值在數(shù)組中的排列順序與for...in遍歷順序一致(區(qū)別在于for...in也會枚舉原型鏈中的屬性).
4: 例: Object.keys( {a:1,b:2} ) // ["a", "b"]
>> Object.values() -- 查看對象的可枚舉屬性的值.(ES7規(guī)范提案中,謹慎使用)
1: 要查看其枚舉屬性的對象.
2: 返回對象的可枚舉屬性的值的數(shù)組.
3: 值在數(shù)組中的排列順序與for...in遍歷順序一致(區(qū)別在于for...in也會枚舉原型鏈中的屬性).
4: 例:Object.values({a:1,b:2}) // [1,2]
>> Object.entries(obj) -- 查看對象的鍵值對(可枚舉的).
1: obj: 要查看的對象.
2: 返回由 [key, value](可枚舉的) 組成的數(shù)組.
3: 鍵值對在數(shù)組中的排列順序與for...in遍歷順序一致(區(qū)別在于for...in也會枚舉原型鏈中的屬性).
4: 例: let o = {a:1,b:2}; Object.entries(o) // [ ["a", 1], ["b", 2] ]
③ 比較,原型
>>Object.is(val1, val2) -- 判斷是否為相同值.
1: 比較不進行類型轉換.
2: 基本與 === 情況相同,區(qū)別如下:
NaN與NaN,返回true.
+0與-0,返回false.
-0與-0,返回true.
+0與+0,返回true,
3: 除非必要情況,否則不要使用此方法,因為性能不如 ===
>> Object.getPrototypeOf(obj) -- 獲取對象原型
1: obj:要返回其原型的對象.
2: 返回其原型,如果沒有則返回null.
>> Object.setPrototypeOf(obj, prototype)
1: obj:要設置其原型的對象. prototype:新原型(對象或null)
2: 不推薦使用此方法,可能會影響其它代碼,性能也是問題. 應該使用Object.create()創(chuàng)建對應原型的對象.
3: 若對象是不可拓展的,會報錯.
④ 對象屬性
屬性描述符具體情況:Object.defineProperty
①中的Object.create() 也可以配置對象屬性.
>> Object.defineProperty(obj, attr, descriptor) -- 配置對象單個屬性
1: obj:在此對象上配置屬性. attr:要定義/修改的屬性. descriptor:屬性描述符對象. 描述符分為:數(shù)據(jù)描述符 , 存取描述符
2: <數(shù)據(jù)描述符>和<存取描述符>均具有以下可選鍵值:
configurable: 布爾值 // true:該屬性可被改變,可被刪除. 默認為false.
enumerable: 布爾值 // true:該屬性可被枚舉. 默認為false.
<數(shù)據(jù)描述符>可選鍵值:
value: 任何有效的JS值. 默認為undefined. //該屬性的值
writable: 布爾值. // true: 值可以被賦值運算符改變. 默認為false.
<存取描述符>可選鍵值:
get: 在獲取屬性值時,返回此方法的函數(shù)返回值. 默認為undefined.
set: 在修改屬性值時,此方法的函數(shù)返回值,成為屬性的新值. 默認為undefined.
3: 具體請看標題下有地址[Object.defineProperty](http://www.reibang.com/p/5eeba874d473)
>> Object.defineProperties(obj, props) -- 配置對象多個屬性
1: obj:在此對象上配置屬性. props: 多個屬性要配置的屬性描述符對象.
2: 規(guī)則同Object.defineProperty().
3: 例子: Object.defineProperties(obj, {
"attr": {
value: true,
writable: true
},
"attr2": {
value: "Hello",
writable: false
}
});
>> Object.getOwnPropertyDescriptor(obj, attr) -- 返回指定對象的指定屬性的屬性描述符.
1: obj: 要查看屬性的對象. attr: 要查看的屬性.
2: 返回描述符對象. 若obj不存在attr屬性返回undefined.
3: 例: Object.getOwnPropertyDescriptor({a:1},'a') // Object {value: 1, writable: true, enumerable: true, configurable: true}
>> Object.getOwnPropertyNames(obj) -- 返回對象由自身的所有屬性名(包括不可枚舉的)組成的數(shù)組
1: obj:要查看的對象.
2: 返回給定對象上找到的屬性對應的字符串數(shù)組盹憎。
3: 例: Object.getOwnPropertyNames({a:1,b:2}) // ["a", "b"]
>> Object.getOwnPropertySymbols(obj) -- 對象的symbol屬性鍵
1: obj: 要查看的對象.
2: 返回所有stmbol類型屬性鍵.
⑤ 凍結,密封,禁止拓展.
>> Object.freeze(obj) -- 凍結對象
1: obj:要被凍結的對象.
2: 凍結指的是:
不能給對象添加新屬性.
不能修改,刪除已有屬性.
不能修改屬性的可枚舉性牡辽、可配置性、可寫性.
若屬性的值是對象,則該對象的屬性不會被凍結,你可以對其進行凍結.
3: 凍結后修改屬性會靜默失敗,嚴格模式下會報錯.
4: 返回凍結后的對象.
>> Object.seal(obj) -- 密封對象
1: obj:要被密封的對象.
2: 密封指定與凍結的唯一區(qū)別.
屬性的值,可以進行修改,其余相同.
3: 返回密封后的對象.
>> Object.preventExtensions(obj)
1: obj: 要設置為不可擴展的對象.
2: 不可拓展是指,不可以添加新的屬性. 可以刪除,修改.
3: 返回設置后的對象.
>> Object.isFrozen(obj)
1: obj:要檢測的對象.
2: 一個對象是凍結的(frozen)是指它不可擴展
,所有屬性都是不可配置的(configurable)侨嘀,且所有數(shù)據(jù)屬性(properties)都是不可寫的(writable). 數(shù)據(jù)屬性是指那些沒有取值器(getter)或賦值器(setter)的屬性。
3: 例: 一個不可拓展(密封)的<空對象> ,凍結后的對象都返回true.
4: 符合2情況,返回treu,否則返回false.
>> Object.isExtensible(obj) -- 檢測對象是否可拓展
1: obj:要檢測的對象.
2: 不可拓展返回true ,反則返回false
凍結,密封,不可拓展,都會返回true捂襟,
>> Object.isSealed(obj) -- 是否是被密封的
1: obj:要檢測的對象.
2: 如果對象是密封的返回true,否則返回false.
密封對象是指那些不可拓展的,且自身屬性都不可配置(configurable)且屬性不可刪除的對象(其可以是可寫的).
>>實例方法(原型的方法,方法都在原型上定義)
let obj = {a:1,b:2}
>> obj.hasOwnProperty(attr) -- 對象是否有指定屬性(而不是其原型有).
1: attr:要檢測的屬性(字符串或者Symbol).
2: 和 in 運算符不同,in會去查看原型鏈的屬性.
3: for...in中使用其進行篩選.
4: 有則返回true,無則返回false.
>> obj.propertyIsEnumerable(attr) -- 屬性是否可以枚舉.
1: attr: 要檢測的屬性.
2: 可以被枚舉返回true,反則返回false.
>> prototypeObj.isPrototypeOf(obj) -- 檢測prototypeObj對象是否在obj的原型鏈上.
1: obj: 在該對象的原型鏈上查找. prototypeObj: 一個原型對象.
2: 是則返回treu,否則返回false.
3: 與instanceof不同. instanceof是檢測是否是obj的構造函數(shù).
>> obj.toString() -- 該對象的字符串形式.
1: obj: 一個對象.
2: 返回該對象的字符串形式.
>> obj.valueOf() -- 返回該對象的原始值.
1: obj: 一個對象.
2: 返回該對象的原始值.
>>實例屬性
>> obj.constructor -- 對象的構造函數(shù)
1: obj: 對象.
2: 返回該對象的構造函數(shù).
3: DOM對象也可以. 例如:
document.constructor // function HTMLDocument() { [native code] }
4: 此對象可以手動改變.
>> obj.__proto__ -- 對象原型,和構造函數(shù)的prototype指向同一對象
1: obj:對象.
2: 不鼓勵使用,建議使用getPrototypeOf()
以上是我所知的的東西飒炎,有任何錯誤,請在評論指出笆豁!
O(∩_∩)O謝謝你的觀看~