let obj = {}
let obj = {}
Object.defineProperty(obj, 'name', {
value: 'heima',
configurable: true
})
delete obj.name
console.log(obj.name) //此处输出内容: undefined
let obj = {}
Object.defineProperty(obj, 'name', {
value: 'heima',
enumerable: false
})
console.log(Object.keys(obj)) //此处输出内容: []
let obj = {}
Object.defineProperty(obj, 'name', {
value: 'heima',
enumerable: true
})
console.log(Object.keys(obj)) //此处输出内容: [ 'name' ]
let obj = {}
Object.defineProperty(obj, 'name', {
value: 'heima',
writable: false
})
obj.name = '传智播客'
console.log(obj) //此处输出内容: {}
let obj = {}
Object.defineProperty(obj, 'name', {
value: 'heima',
writable: true
})
obj.name = '传智播客'
console.log(obj.name) //此处输出内容: 传智播客
function isObject(target) {
return Object.prototype.toString.call(target).slice(8, -1).toLowerCase() === 'object'
}
function observe(target) {
if (isObject(target)) {
for (let key in target) {
defineProerties(target, key, target[key])
}
}
}
function defineProerties(obj, key, value) {
observe(value)
Object.defineProperty(obj, key, {
get() {
return value
},
set: (newVal) => {
if (newVal !== value) {
observe(newVal)
trigger()
value = newVal
}
}
})
}
function trigger() {
console.log('数据触发更新了')
}
let obj = {
school: '传智播客',
info: {
address: '三鸿路'
}
}
// 进行数据劫持
observe(obj)
// 给school重新赋值成 '黑马'
obj.school = '黑马'
console.log(obj)
let obj = {
school: '传智播客',
info: {
address: '三鸿路'
}
}
// 进行数据劫持
observe(obj)
// 给info下面的address属性重新赋值成 '四鸿路'
obj.info.address = '四鸿路'
console.log(obj.info)
let obj = {
school: '传智播客',
info: {
address: '三鸿路'
}
}
// 进行数据劫持
observe(obj)
// 给obj的info属性重新赋值一个对象时
obj.info = {a: 1}
console.log(obj.info)
let arr = [1, 2, 3]
arr.forEach((item, index) => defineProerties(arr, index, item))
arr[0] = 100
let obj = { name: 'heima' }
let proxy = new Proxy(obj, {
get() {
console.log('--get--')
return obj.name
}
})
console.log(proxy.name) // --get-- care
let toProxy = new WeakMap()
let toRaw = new WeakMap()
function trigger() {
console.log('数据更新了')
}
function isObject(target) {
return typeof target === 'object' && target !== null
}
function observer(target) {
if (!isObject(target)) {
return target
} else {
const proxy = toProxy.get(target)
if (proxy) {
return proxy
}
if (toRaw.has(target)) {
return target
}
const handler = {
set(target, key, value, receiver) {
// 过滤私有属性 length
if (target.hasOwnProperty(key)) {
trigger()
}
return Reflect.set(target, key, value, receiver)
},
get(target, key, receiver) {
if (isObject(target[key])) {
return observer(target[key])
}
return Reflect.get(target, key, receiver)
},
deleteProperty(target, key, receiver) {
return Reflect.deleteProperty(target, key, receiver)
}
}
let observed = new Proxy(target, handler)
console.log('proxy')
toProxy.set(target, observed) // 源对象和代理过后的对象做一个hash表
toRaw.set(observed, target) // 已经代理过后的对象和原对象做一个hash表
return observed
}
}
let obj = {
name: 'heima',
a: [1, 2, 3]
}
let proxy = observer(obj)
proxy.name = '传智播客'
console.log(proxy) // proxy 数据更新了 { name: '传智播客', a: [ 1, 2, 3] }
let arr = [1, 2, 3]
let proxy = observer(arr)
proxy.push(4)
console.log(proxy) // proxy 数据更新了 [ 1, 2, 3, 4]
let obj = {
name: 'heima',
a: [1, 2, 3]
}
let proxy = observer(obj)
proxy = observer(proxy)
proxy = observer(proxy)
proxy = observer(proxy)
console.log(proxy) // proxy { name: 'heima', a: [1, 2, 3] }
let obj = {
name: 'heima',
a: [1, 2, 3]
}
let p1 = observer(obj)
p2 = observer(p1)
p3 = observer(p2)
p4 = observer(p3)
console.log(p4) // proxy { name: 'heima', a: [ 1, 2, 3] }
let obj = {
name: 'heima',
a: [1, 2, 3]
}
let proxy = observer(obj)
proxy.a.push(4)
console.log(proxy) // proxy proxy 数据更新了 { name: 'heima', a: [ 1, 2, 3, 4] }
1.png (253.14 KB, 下载次数: 27)
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) | 黑马程序员IT技术论坛 X3.2 |