今天看到对象这一章节,对象这一章需要理解的内容非常的多,而且比较的晦涩。在书中看到一个方法,理解透彻了,写下来再复习复习,捋一捋思路。
/*============================================== *给Object.prototype添加一个不可枚举的extend()方法 *这个方法继承调用它的对象,将作为参数传入的对象的属性一一复制 *除了值以外,也复制属性的所有特性,除非在目标对象中有存在同名的属性 *参数对象的所有自有对象(包括不可枚举的属性)也会一一复制 ===============================================*/ Object.defineProperty ( Object.prototype, "extend", // 添加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; // 获取o中的属性的描述符 var desc = Object.getOwnPropertyDescriptor( o , names[i] ); // 用它给this创建一个属性 Object.defineProperty( this, names[i], desc ); } } } );
值得一提的是Object.getOwnPropertyNames()和Object.keys()的区别在于:前者可以获得不可枚举的属性,而后者不可以。