1. 程式人生 > >晝貓筆記 JavaScript -- 面向物件(I)

晝貓筆記 JavaScript -- 面向物件(I)

本文內容搬運自公眾號 原文連結


 

本文主要內容:面向物件

預計閱讀時間:6分鐘

 

面向物件的方式

  • 單例模式(字面量定義) var obj = {}

  • 類的例項 var obj = new Object()

  • 工廠建立

  • 建構函式 扮演了三種角色,(普通函式、普通物件、類)

 

面向物件相關問題

  • 建構函式裡的屬性怎麼看?看this,誰前面有this誰就是屬性
function Zhoumao(name, age) {
    var name = '晝貓'
    this.name = name;
    
this.age = age; // name 不屬於 }

 

  • 如何查詢面向物件中的this
  1. 建構函式裡的this執行例項物件

  2. 如果是方法中的this,分以下幾種情況
    a. 找到this 在呼叫方式時,看方法前的 . 是誰,this就是誰
    b. 替換this 將this化成找到的那個結果
    c. 精確查詢 用原型鏈查詢模式

  3. 關於建構函式中的返回值
    建構函式也是函式,每個函式都有返回值,建構函式返回的是this

  4. 原型的批量新增和直接物件新增的區別

如果是批量新增屬性,沒有改變原型的記憶體地址(瀏覽器開闢)
如果是以物件形式新增,就會更改原型的記憶體地址,瀏覽器開闢的就會銷燬

function Zhoumao() {
    this.name = 'zhoumao'
}
Zhoumao.prototype.age = '12'
Zhoumao.prototype = {
    sxc: 44
}
var zm = new Zhoumao
var hello = new Zhoumao
console.log(hello.age)  // undefined

 

  •  如何給內建類新增方法

如果給內建類的原型新增方法,使用物件形式新增,不起作用。因為瀏覽器會保護內建類物件的原型記憶體地址,只能使用批量的形式新增方法

// 這種方法是錯的
Array.prototype = {
    sum: function () {}
    // 只能用這種方法新增
    Array.prototype.sum = function () {}
}
  • 拷貝
    • 淺拷貝:利用 for in 將一個物件的屬性,一個一個的複製到另一個物件中
var obj = {
    name: '晝貓',
    age: '12'
    }
var obj2 = {}
for(var key in obj){
    obj2[key] = obj[key]
}
console.log(obj2)
    • 深拷貝:如果物件中的屬性值又是一個引用資料型別,淺拷貝,還是把後面的引用資料型別的地址賦值給空物件的屬性,深拷貝,將屬性值一個個遍歷賦值
//將其打包,方便以後使用
function extend(oldObj, newObj) {
    for (var key in oldObj) {
    var item = oldObj[key]
    if (item instanceof Array) { // 陣列
            newObj[key] = []
        extend(item, newObj[key])
    } else if(item instanceof Object){ // 物件
        newObj[key] = {}
        extend(item, newObj[key])
    }else { // 基本型別
        newObj[key] = item    
        }    
    }
}
var obj = {
    name: '晝貓',
    age: '12',
    ss: ['1', '2', '3'],
    ssObj: {
        sex: '男',
    node: '晝貓筆記',
    fun: function () {
            console.log(111)
    }    }
}
var obj2 = {}
function extend(oldObj, newObj) {
    for (var key in oldObj) {
    var item = oldObj[key]
    if (item instanceof Array) { // 陣列
            newObj[key] = []
        extend(item, newObj[key])
    } else if(item instanceof Object){ // 物件
        newObj[key] = {}
        extend(item, newObj[key])
    }else { // 基本型別
        newObj[key] = item        
        }
    }
}
extend(obj, obj2);
console.log(obj2);
View Code