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()函数