Vue框架核心之資料劫持

2021-08-24 18:03:40 字數 2312 閱讀 5092

引數obj:目標物件

prop:需要定義的屬性或方法的名稱

descriptor:目標屬性所擁有的特性

可供定義的特性列表

value:屬性的值

writable:如果為false,屬性的值就不能被重寫。

get: 一旦目標屬性被訪問就會調回此方法,並將此方法的運算結果返回使用者。

set:一旦目標屬性被賦值,就會調回此方法。

configurable:如果為false,則任何嘗試刪除目標屬性或修改屬性性以下特性(writable,    configurable, enumerable)的行為將被無效化。

enumerable:是否能在for...in迴圈中遍歷出來或在object.keys中列舉出來。

var data = 

object.keys(data).foreach(function(key),

set:function()

})});data.name //控制台會列印出 「get」data.name = 'hxx' //控制台會列印出 "監聽到資料發生了變化"

export function definereactive (

obj: object,

key: string,

val: any,

customsetter?: function

)   // cater for pre-defined getter/setters  const getter = property && property.get  const setter = property && property.set

let childob = observe(val)//建立乙個觀察者物件  object.defineproperty(obj, key, 

if (array.isarray(value)) 

}return value//返回屬性值    },

set: function reactivesetter (newval) 

//這個是用來判斷生產環境的,可以無視      if (process.env.node_env !== 'production' && customsetter) 

if (setter)  else 

childob = observe(newval)//繼續監聽新的屬性值      dep.notify()//這個是真正劫持的目的,要對訂閱者發通知了    }

})}

const arrayproto = array.prototype//原生array的原型export const arraymethods = object.create(arrayproto)

;[  'push',

'pop',

'shift',

'unshift',

'splice',

'sort',

'reverse']

.foreach(function (method) 

switch (method) 

if (inserted) ob.observearray(inserted)

// notify change    ob.dep.notify()

return result

})})...//定義屬性function def (obj, key, val, enumerable) );

}

var arraymethod = object.create(array.prototype);

['push','shift'].foreach(function(method)

var original = array.prototype[method];

console.log("已經控制了,哈哈");

return result;

},enumerable: true,

writable: true,

configurable: true    })

})var bar = [1,2];

bar.__proto__ = arraymethod;

bar.push(3);//控制台會列印出 「已經控制了,哈哈」;並且bar裡面已經成功的新增了成員 『3』

vm.items[index] = "***";

vm.items.length = 100;

var vm = new vue(,    el:'#id'})
function proxy (vm, key) ,

set: function proxysetter (val) 

});}}

Vue框架核心之資料劫持

引數obj 目標物件 prop 需要定義的屬性或方法的名稱 descriptor 目標屬性所擁有的特性 可供定義的特性列表 value 屬性的值 writable 如果為false,屬性的值就不能被重寫。get 一旦目標屬性被訪問就會調回此方法,並將此方法的運算結果返回使用者。set 一旦目標屬性被...

Vue核心之資料劫持

當前前端界空前繁榮,各種框架橫空出世,包括各類mvvm框架橫行霸道,比如anglar,regular,vue,react等等,它們最大的優點就是可以實現資料繫結,再也不需要手動進行dom操作了,它們實現的原理也基本上是髒檢查或資料劫持。那麼本文就以vue框架出發,探索其中資料劫持的奧秘 本文所選取的...

vue 資料劫持

其實,並沒有這麼 神奇 的事,資料劫持的核心就是在 物件的身上重新定義被 物件所有可列舉屬性,並設定 getter 和 setter 監視著它的變化,然而實現這個核心功能就是乙個方法 object.defineproperty 通過該方法在例項物件上重新定義了和data物件裡面的所有屬性,然而就實現...