Comparison of proxy and Object.defineProperty

Comparison of proxy and Object.defineProperty

Advantages of proxy

1. More object operations can be monitored (delete operations and method calls in objects, etc.)

defineProperty can only monitor the reading and writing of properties

const stu = {
    
    
    name : 'tianqin',
    gender : 'female',
    age: ' 8'
}
const proxyStu = new Proxy( stu ,{
    
    
    deleteProperty(target ,property){
    
    
        console.log('delete',property);
        delete target[property]  
    }
})
delete proxyStu.age 
console.log(stu)


/*  
这是输出后的内容 ,可以看到 age 属性已经被删掉了 

[nodemon] restarting due to changes...
[nodemon] starting `node .\proxy.js`
delete age
{ name: 'tianqin', gender: 'female' }
[nodemon] clean exit - waiting for changes before restart



*/

Other extended operation methods:

handler method Trigger method
get Read an attribute
set Write an attribute
has in operator
deleteProperty delete operator
getProperty Object.getPropertypeOf( )
setProperty Object.setPropertypeOf( )
isExtensible Object.isExtensible( )
preventExtensions Object.preventExtensions( )
getOwnPropertyDescriptor Object.getOwnPropertyDescriptor( )
defineProperty Object.defineProperty( )
ownKeys Object.keys( ) \ Object.getOwnPropertyNames( ) \ Object.getOwnPropertySymbols( )
apply Call a function
construct Call a function with new

Two, proxy supports operations on array objects

const arr = []
const arrProxy = new Proxy(arr,{
    
    
    set(target , property ,value) {
    
    
        console.log('set',property, value)
        target[property] = value;
        return true;
    }
})
arrProxy.push(100);
arrProxy.push(100);
console.log(arr)

/*
输出结果:
set 0 100
set length 1
set 1 100
set length 2
[ 100, 100 ]

*/

Three, do not need to invade the object

The proxy will not perform any operations on the original object, but will read and write to the internal object

const person ={
    
    }
const personProxy = new Proxy(person,{
    
    
    get(target ,property){
    
    
        return target[property]
    },
    set(target,property,value){
    
    
        target[property] = value
    }
})

反关defineProperty

const obj = {
    
    }
Object.defineProperty(obj , 'name',{
    
    
    get(){
    
    
        console.log('the name has been updated!')
        return obj.__name;
    },
    set(value){
    
    
        console.log('the name has been set')
        obj._name = value
    }
})
Object.defineProperty(obj , 'age',{
    
    
    get(){
    
    
        console.log('the age has been updated!')
        return obj._age;
    },
    set(value){
    
    
        console.log('the age has been set')
        obj._age = value
    }
})
obj.name = 'tianqin~';

Guess you like

Origin blog.csdn.net/qq_43377853/article/details/110292820