1.Object.getPrototypeOf()
Object.getPrototypeOf方法返回参数对象的原型。这是获取原型对象的标准方法
var F = function () {}; var f = new F(); Object.getPrototypeOf(f) === F.prototype // true
// 空对象的原型是 Object.prototype Object.getPrototypeOf({}) === Object.prototype // true // Object.prototype 的原型是 null Object.getPrototypeOf(Object.prototype) === null // true // 函数的原型是 Function.prototype function f() {} Object.getPrototypeOf(f) === Function.prototype // true
2.Object.setPrototypeOf()
Object.setPrototypeOf方法为参数对象设置原型,返回该参数对象。它接受两个参数,第一个是现有对象,第二个是原型对象
var a = {}; var b = {x: 1}; Object.setPrototypeOf(a, b); Object.getPrototypeOf(a) === b // true a.x // 1
3.Object.create()
JavaScript 提供了Object.create方法。该方法接受一个对象作为参数,然后以它为原型,返回一个实例对象。该实例完全继承原型对象的属性。
4.Object.prototype.isPrototypeOf()
实例对象的isPrototypeOf方法,用来判断该对象是否为参数对象的原型
var o1 = {}; var o2 = Object.create(o1); var o3 = Object.create(o2); o2.isPrototypeOf(o3) // true o1.isPrototypeOf(o3) // true
上面代码中,o1和o2都是o3的原型。这表明只要实例对象处在参数对象的原型链上,isPrototypeOf方法都返回true
Object.prototype.isPrototypeOf({}) // true Object.prototype.isPrototypeOf([]) // true Object.prototype.isPrototypeOf(/xyz/) // true Object.prototype.isPrototypeOf(Object.create(null))
上面代码中,由于Object.prototype处于原型链的最顶端,所以对各种实例都返回true,只有直接继承自null的对象除外
5.Object.prototype.proto
实例对象的__proto__属性(前后各两个下划线),返回该对象的原型
var obj = {}; var p = {}; obj.__proto__ = p; Object.getPrototypeOf(obj) === p // true
6.Object.getOwnPropertyNames()
Object.getOwnPropertyNames方法返回一个数组,成员是参数对象本身的所有属性的键名,不包含继承的属性键名
Object.getOwnPropertyNames(Date) // ["parse", "arguments", "UTC", "caller", "name", "prototype", "now", "length"]
Object.getOwnPropertyNames方法返回所有键名,不管是否可以遍历
只获取那些可以遍历的属性,使用Object.keys方法
Object.keys(Date) // []
7.Object.prototype.hasOwnProperty()
对象实例的hasOwnProperty方法返回一个布尔值,用于判断某个属性定义在对象自身,还是定义在原型链上。
Date.hasOwnProperty('length') // true Date.hasOwnProperty('toString') // false
8.Object.getOwnPropertyDescriptor()
返回某个对象属性的描述对象( descriptor )
var obj = { p: 'a' }; Object.getOwnPropertyDescriptor(obj, 'p')
9.Object.assign()
Object.assign是ES6新添加的接口,主要的用途是用来合并多个JavaScript的对象
Object.assign()接口可以接收多个参数,第一个参数是目标对象,后面的都是源对象,assign方法将多个原对象的属性和方法都合并到了目标对象上面,如果在这个过程中出现同名的属性(方法),后合并的属性(方法)会覆盖之前的同名属性(方法)。
var target = {a : 1}; //目标对象 var source1 = {b : 2}; //源对象1 var source2 = {c : 3}; //源对象2 var source3 = {c : 4}; //源对象3,和source2中的对象有同名属性c Object.assign(target,source1,source2,source3); //结果如下: //{a:1,b:2,c:4}
Object.assign拷贝的属性是有限制的,只会拷贝对象本身的属性(不会拷贝继承属性),也不会拷贝不可枚举的属性。但是属性名为Symbol值的属性,是可以被Object.assign拷贝的
10.获得对象的所有属性(不管是自身的还是继承的,也不管是否可枚举),可以使用下面的函数
function inheritedPropertyNames(obj) { var props = {}; while(obj) { Object.getOwnPropertyNames(obj).forEach(function(p) { props[p] = true; }); obj = Object.getPrototypeOf(obj); } return Object.getOwnPropertyNames(props); } console.log(inheritedPropertyNames(Date))