Object.getPrototypeOf()
返回参数对象的原型
function F(){};var f = new F();Object.getPrototypeOf(f) === F.prototype; // true
几种特殊对象的原型
// 空对象的原型Object.getPrototypeOf({}) === Object.prototype; // true// Object.prototypeObject.getPrototypeOf(Object.prototype) === null; // true;// 函数的原型function F(){};Object.getPrototypeOf(f) === Function.prototype;
Object.setPrototypeOf()
该方法为参数对象设置原型,返回该参数对象
-
Object.create()
通过实例对象生成另外一个实例对象
- 该方法接收一个对象为参数,以它为原型,返回一个实例对象 ```javascript // 原型对象 var A = { print: function() { console.log(“hello”); } }; // 实例对象 var B = Object.create(A);
Object.getPrototypeOf(B) === A // true
3. 生成一个不继承任何属性的对象```javascriptObject.create(null);
该方法可以接收第二个参数,第二个参数是属性描述符对象,会添加到实例对象,作为对象自身的属性
var obj = Object.create({},{p1: {value: 123,enumerable: true,configurable: true,writable: true},p1: {value: "abc",enumerable: true,configurable: true,writable: true}});
Object.prototype.isPrototypeOf()
实例对象的方法,用来判断该对象是否为参数对象的原型
var o1 = {};var o2 = Object.create(o1);var o3 = Object.create(o2);o2.isPrototypeOf(o3);// true;o1.isPrototypeOf(o1);// true;
Object.prototypeproto
返回该对象的原型
- 该属性可读写
- 只在浏览器环境中存在
- 本质是内部属性,不应该对使用者暴露
应该适用Object.getPrototypeof()和Object.setPrototypeOf()代替
获取原型对象方法的比较
获取原型对象的方法:
- Object.getPrototypeOf()
- obj.proto
- obj.constructor.prototype
-
Object.getOwnPropertyNames()
用来获取对象本身的所有属性的键名,不包含继承的属性键名
- 返回值是一个数组,数组成员是参数对象本身的所有属性的键名
对象本身的属性中,有些属性是可以遍历的,有些属性是不可以遍历的;Object.getOwnPropertyNames返回所有键名,不管是否可以遍历
Object.keys()
-
Object.prototype.hasOwnProperty()
对象实例的
hasOwnProperty返回布尔值- 该方法用于判断某个属性是对象自身的还是原型链上的,如果是自身的返回true,否则返回false
hasOwnProperty方法是唯一一个处理对象属性时,不会遍历原型链的方法in
in运算符返回一个布尔值,表示一个对象是否具有某个属性- 不会区分属性时对象自身的属性还是继承的属性
-
for…in
获取对象的所有可遍历属性(不管是自身的还是继承的)
var o1 = {p1: 1};var o2 = Object.create(o1,{p2: 2,enumerable: true});for (p in o2) {console.log(p);}// p2// p1
在
for...in循环中可以通过hasOwnProperty方法来判断获取对象自身的属性for(var name in object){if (object.hasOwnProerty(name)){}}
获取对象的所有属性,不管是自身的还是继承的, 也不管是否可枚举
function inheritedPropertyNames(obj){var props = {};while(obj){Object.getOwnPropertyNames(obj).forEach(function(prop){props[prop] = true})obj = Object.getPrototypeOf(obj);}return Object.getOwnPropertyNames(props);}
对象的拷贝
拷贝一个对象,分为两个步骤:
- 拷贝后的对象和原对象具有同样的原型
拷贝后的对象和原来的对象具有相同的实例属性
function copyObject(orig){var copy = Object.create(Object.getPrototypeOf(orig));copy = copyOwnPropertiesFrom(copy,orig);return copy;}function copyOwnPropertiesFrom(target,source){var props = Object.getOwnPropertyNames(source);props.forEach(function(p) {var desc = Object.getOwnPropertyDescriptor(source, p);Object.defineProperty(target,p,desc);});return target;}
另外一种更简单的写法
function copyObject(orig) {return Object.create(Object.getPrototypeOf(orig),Object.getOwnPropertyDescriptors(orig));}
