js源代码实现(二)

深度拷贝

function deepclone(obj){
    var newobj = obj instanceof object? {} : []
    for(var item in obj){
        var tmp = typeof obj[item] == 'object'? deepclone(obj[item]): obj[item]
        newobj[item] = tmp
    }
    return newobj
}

原生ajax实现方式(promise实现)

var promiseAjax = function(method,url){//method为get,post方法
    return new promise((resolve,reject) =>{
        var xhr = new XMLHttpRequest()
        xhr.open(method,url)
        xhr.send(null)
        xhr.onreadystatechange = function(){
            if( xhr.status == 200 && xhr.readystate == 4){
                resolve(xhr.responseText)
            }
            else{
                reject('error')
            }
        }
    })
}

监听对象属性方法

//ES5方法     Object.defineProperty
var obj = {
    name: '康康'
}
var age = 18
Object.defineProperty(obj,'age',{
    configurable: false,   //是否可被重定义
    enumerable: false,     //是否可枚举
    //如果有get和set了一定要把这两个去掉
    value: 'undifined',    //属性默认值
    writable: false,       //该属性为true时才可被value值改变
    get: function(){
        return age
    },
    set: function(newvalue){
        age = newvalue
    }
})

//ES6方法   proxy
var obj = {
    name: '康康'
}
let newobj = new Proxy(obj,{
    get: function(target,property){
        return target[property]
    },
    set: function(target, property, value) {
        if (property !== 'name') {
            throw new ReferenceError(`${property}属性未定义在${target}对象上`)
        }
        if(value){
            target[property] = value+'哈哈哈'
        }
    }
})
newobj.name='大康'  //康康

new操作做了哪些事情,手动实现new

  1. 返回一个新的对象
  2. 改变this的指向,将其指向新建的对象
  3. 将构造函数的prototype赋值给新建对象的_proto_
function _new(obj){
    return function(){
        let o = {
            _proto_: obj.prototype
        }
        obj.apply(o,arguments)
        return o
    }
}

你可能感兴趣的:(js源代码实现(二))