NOW,今天让我们来实现一个extend函数。

具体思路: 使用Object.defineProperty()对属性的特性进行设置,然后通过Object.getOwnPropertyDescriptor()获取到属性描述符,并赋值给新创建的对象

下面我们把代码拉出来溜溜

    Object.defineProperty(Object.prototype,
        "extend",
        {
            writable: true,
            enumerable: false,
            configurable: true,
            value: function(o){
                // 获取所有的自有属性
                var names = Object.getOwnPropertyNames(o);
                for(var i =0;i< names.length;i++){
                    // 如果属性已存在则跳过
                    if(names[i] in this) continue;
                    // 获取该属性的属性描述符ss
                    var desc = Object.getOwnPropertyDescriptor(o,names[i]);
                    Object.defineProperty(this,names[i],desc)
                }
            }
        }
    )   

使用示例:

  // 定义一个新对象
    var a = {
        itemA: 1
    }
    // 新建一个属性,并设置属性描述符
    Object.defineProperty(a,"itemB",{
        writable: true,
        enumerable: false,
        configurable: true,
        value: 2
    })
    // 再定义一个新对象
    var b = {}
    b.extend(a)
    // 此时我们可以看到静态属性已经继承过去了
    console.log(b)  // 结果为{itemA: 1,itemB: 2}
    //再来看看属性描述符是不是也过去了
    let extendDesc = Object.getOwnPropertyDescriptor(b,"itemB")
    console.log(extendDesc)  // 结果为{value: 2, writable: true, enumerable: false, configurable: true}

好了,结束,有机会我们一起来模拟实现一下Object.create()函数

 

01-16 09:08