vueはObjectを使用する.definePropertyデータの変更をリスニングする

2135 ワード


vue Objectの使い方defineProperty
/**
 *          
 *           
 */
const oldPropType = Array.prototype;
const newPropType = Object.create(oldPropType);
['push', 'prop', 'shift', 'unshift', 'sort', 'splice', 'reverse'].forEach(method => {
    newPropType[method] = function () {
        oldPropType[method].call(this, ...arguments);
        //    
        render();
    }
})

/**
 *        
 * @param bean     
 * @param key  
 * @param value  
 * @returns {*}
 */
function defineReactive(bean, key, value) {
    //            
    observer(value);
    //  defineProperty         
    Object.defineProperty(bean, key, {
        get() {
            return value;
        },
        set(newVal) {
            //                
            if (value === newVal) {
                return
            }
            //        
            value = newVal;
            //       
            render()
        }
    })
}

/**
 *     
 * @param data
 */
function observer(data) {
    //        
    if (Array.isArray(data)) {
        //                   ,              
        data.__proto__=newPropType;
        return;
    }
    //     ,                 
    if (typeof data === 'object') {
        for (const key in data) {
            defineReactive(data, key, data[key]);
        }
    }
}

/**
 *       
 */
function render() {
    console.log('    ')
}

/**
 * set  
 * @param data    
 * @param key     
 * @param value     
 * @returns {*}
 */
function $set(data,key,value) {
    if(Array.isArray(data)){
        data.splice(key,1,value)
        return
    }
    defineReactive(data,key,value);
    render()
    return value
}

/**
 * deltet  
 * @param data     
 * @param key      
 */
function $delete(data,key) {
    if(Array.isArray(data)){
        data.splice(key,1);
        return
    }
    delete data[key]
    render();
}
//  vue  data   
const data = {
        name: 'shu',
        obj: {
            age: 12,
            name: 'ce'
        },
        arr:[1,2]
    }
//     observer()        
observer(data)