JS系列 -- JavaScript 對象之基礎(chǔ) + 遍歷 + 原型鏈

概述

對象就是一組數(shù)據(jù)和功能的集合。它相當(dāng)于哈希(鍵值對),使用對象屬性有 [ ] 操作(obj[ 'name' ])和點(diǎn)操作(obj.name

  • 鍵名 ==> 字符串(ES6 又引入了 Symbol 值也可以作為鍵值)
  • 鍵名 ==> 數(shù)值 ==(自動轉(zhuǎn)為)==> 字符串
  • 鍵名 ==> 不符合標(biāo)識名的條件(比如第一個字符為數(shù)字,或者含有空格或運(yùn)算符),且也不是數(shù)字,則必須加上引號,否則會報(bào)錯
obj["name"]   // 必須帶有 " " ,如果不帶 " " JS 首先會找 name 的值,但是 name === undefined ,自然就報(bào)錯了 
  • 鍵名 ==> 滿足標(biāo)識符(變量名)的規(guī)則 ==> obj.name(可以使用點(diǎn)操作符)
  • delete 操作符刪除對象屬性
    delect obj["name"]
    obj.name   // undefined(無value)
    name in obj   // false(無key)
    

對象聲明

  1. var obj1 = {} 
    
  2.  var obj2 = new Object();  //obj1 和 obj2 沒有區(qū)別,但是 obj1 === obj2     是 false ,因?yàn)榇鎯υ?Stsck(棧內(nèi)存) 中的地址不同
    
  3. var obj3 = Object.create(Object.prototype)
    

基本包裝類型:Boolean() Number() String()

基本包裝類型有屬性 __proto__ ,這個屬性引用(指向)了在 Heap( 堆內(nèi)存 ) 的一個地址,這個地址表示基本包裝類型對應(yīng)的 prototype(原型)?;景b類型有重寫屬性(表示重寫屬性從而覆蓋 Object 的 prototype

  • Number()


    基本包裝類型 Number
  • String()


    基本包裝類型 String
  • Boolean()


    基本包裝類型 Boolean

遍歷對象

for ... in ... 遍歷 自身 + 原型

通過 Objct.prototype.hasOwnProprety 篩選出自身屬性

for( let key in obj ){
    if( obj.hasOwnProperty( key ) ){
        console.log( obj[ key ] )  // 此時必須使用 [] ,key 表示的是字符串
    }
}

Object for...in 遍歷

Object.keys() + Object.values() 遍歷 自身可枚舉屬性

Object.keys() + Object.values() 這兩種方法的返回值都是一個數(shù)組

Object.keys(obj).forEach( ( item ) => {
    console.log( item )
})
Object.keys() + Object.values() 遍歷

Object.getOwnPropertyNames() 遍歷 自身可枚舉 + 自身不可枚舉

返回由指定對象的所有自身屬性的屬性名(包括不可枚舉但不包括 Symbol 值作為名稱的屬性)組成的數(shù)組

Object.getOwnPropertyNames( obj ).forEach( (item) => {
    console.log( obj[ item ] )
})

proto + prototype

實(shí)例化對象的 __proto__ 指向構(gòu)造函數(shù)的 prototype,即對象.__proto__ === 函數(shù).prototype

"1".__proto__ === String.prototype
1.__proto__ === Number.prototype
true.__proto__ === Boolean.prototype

測試

let arr = []
arr.__proto__ === ??? 
Array.__proto__ === ???
typeof Array.prototype  ???
Array.prototype.__proto__ === ???

答案

arr.__proto__ === Array.prototype
Array.__proto__ === Function.prototype
typeof Array.prototype  // 'Object'
Array.prototype.__proto__ === Object.prototype

對象屬性賦值 + 查找

對象屬性賦值是在自身屬性賦值,不會修改原型鏈,而查找會在原型鏈中查找

instanceof

instanceof 是在原型鏈中查找是否是其實(shí)例(instance)

instanceof 實(shí)現(xiàn)

function _instanceof( instance, fn ){
    let i = instance.__proto__
    while( i ){
        if( i === fn.prototype ){
            return true
        }
        i = i.__proto__
    }
    return false
}

繼承

實(shí)現(xiàn)繼承主要是要實(shí)現(xiàn)原型的屬性 + 方法

屬性繼承

call

方法繼承

Object.create()
Object.setPrototypeOf()

屬性 + 方法繼承

new

繼承示例

相關(guān)知識點(diǎn)

最簡單的克隆

result = JSON.parse( JSON.stringify( obj ) )
toString

However for 1.toString(), the JS engine cannot determine what does . mean - a dot operator (for object methods), or a float number point?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容