晝貓筆記 JavaScript -- 面向物件(I)
阿新 • • 發佈:2019-01-10
本文內容搬運自公眾號 原文連結
本文主要內容:面向物件
預計閱讀時間:6分鐘
面向物件的方式
-
單例模式(字面量定義) var obj = {}
-
類的例項 var obj = new Object()
-
工廠建立
-
建構函式 扮演了三種角色,(普通函式、普通物件、類)
面向物件相關問題
- 建構函式裡的屬性怎麼看?看this,誰前面有this誰就是屬性
function Zhoumao(name, age) { var name = '晝貓' this.name = name;this.age = age; // name 不屬於 }
- 如何查詢面向物件中的this
-
建構函式裡的this執行例項物件
-
如果是方法中的this,分以下幾種情況
a. 找到this 在呼叫方式時,看方法前的.
是誰,this就是誰
b. 替換this 將this化成找到的那個結果
c. 精確查詢 用原型鏈查詢模式 -
關於建構函式中的返回值
建構函式也是函式,每個函式都有返回值,建構函式返回的是this -
原型的批量新增和直接物件新增的區別
如果是批量新增屬性,沒有改變原型的記憶體地址(瀏覽器開闢)
如果是以物件形式新增,就會更改原型的記憶體地址,瀏覽器開闢的就會銷燬
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