1、Object.getPrototypeOf():返回参数对象的原型,这是获取原型对象的标准方法。
var Test = function () {};
var test = new Test();
console.log(Object.getPrototypeOf(test)); //{constructor: ƒ}
console.log(Object.getPrototypeOf(test) === Test.prototype); //true
// 空对象的原型是 Object.prototype
console.log(Object.getPrototypeOf({}) === Object.prototype) // true
// Object.prototype 的原型是 null
console.log(Object.getPrototypeOf(Object.prototype) === null) // true
// 函数的原型是 Function.prototype
function f() {}
console.log(Object.getPrototypeOf(f) === Function.prototype) // true
2、Object.setPrototypeOf():为参数对象设置原型,返回该参数对象。它接受两个参数,(现有对象,原型对象)。
var obj = {};
var obj_ = {x:1};
Object.setPrototypeOf(obj, obj_);
console.log(obj); //{}
console.log(Object.getPrototypeOf(obj) === obj_); //true
console.log(obj.x); //1
//Object.setPrototypeOf()方法将对象obj的原型设置为对象obj_,所以obj可以共享obj_的属性。
3、Object.create():该方法接受一个对象作为参数,然后以它为原型,返回一个实例对象,该实例完全继承原型对象的属性。 使用Object.create方法时,必须提供对象原型,即参数不能为空,或者不是对象,否则报错。
//原型对象
var obj = {
print: function() {
console.log('Hello World!');
}
};
//实例对象
var obj_ = Object.create(obj);
console.log(Object.getPrototypeOf(obj_) === obj); //true
console.log(obj_.print === obj.print); //true
obj_.print(); //Hello World!
//以obj对象为原型,生成了obj_对象,obj_继承了obj的所有属性和方法。
Object.create方法生成的新对象,动态继承了原型,在原型上添加或修改任何方法,会立刻反映在新对象上。
var obj1 = {x:1};
var obj2 = Object.create(obj1);
console.log(obj2.x); //1
obj1.x = 2;
console.log(obj2.x); //2
Object.create方法生成的对象,继承了它的原型对象的构造函数。
function Test() {};
var test = new Test();
var obj = Object.create(test);
console.log(obj.constructor); // ƒ Test() {}
console.log(obj.constructor === Test); //true
console.log(obj instanceof Test); //true
4、Object.prototype.isPrototypeOf():用来判断该对象是否为参数对象的原型。
var obj1 = {};
var obj2 = Object.create(obj1);
var obj3 = Object.create(obj2);
console.log(obj2.isPrototypeOf(obj3)); //true
console.log(obj1.isPrototypeOf(obj3)); //true
//obj1和obj2都是obj3的原型,只要实例对象处在参数对象的原型链上,isPrototypeOf方法都返回true。
var a = Object.prototype.isPrototypeOf({});
var b = Object.prototype.isPrototypeOf([]) ;
var c = Object.prototype.isPrototypeOf(/xyz/);
var d = Object.prototype.isPrototypeOf(Object.create(null));
console.log(a); //true
console.log(b); //true
console.log(c); //true
console.log(d); //false
//由于Object.prototype处于原型链的最顶端,所以对各种实例都返回true,只有直接继承自null的对象除外.
5、Object.prototype._proto_:实例对象的_proto_属性,返回该对象的原型,该属性可读写。
var A = {
name: '张三'
};
var B = {
name: '李四'
};
var proto = {
print: function () {
console.log(this.name);
}
};
A.__proto__ = proto;
B.__proto__ = proto;
A.print() // 张三
B.print() // 李四
6、 获取原型对象方法的对比:获取实例对象obj的原型对象有三种方法:
obj._proto_ obj.constructor.prototype Object.getPrototypeOf(obj)
上面三种方法中,_proto_属性只有浏览器才需要部署,其他环境可以不部署;obj.constructor.prototype在手动改变原型对象时,可能会失效。所以,推荐使用第三种Object.getPrototypeOf()方法,获取原型对象。
7、Object.getOwnPropertyNames():返回一个数组,成员是参数对象本身的所有属性的键名,不包含继承的属性键名。
var result = Object.getOwnPropertyNames(Date);
console.log(result); //(6) ["length", "name", "prototype", "now", "parse", "UTC"]
//Object.getOwnPropertyNames 方法返回所有键名(不管对象本身的属性是否可以遍历)。
//如果只需要获取那些可以遍历的属性,使用Object.keys方法。
var result2 = Object.keys(Date);
console.log(result2); //[] Date对象所有自身的属性,都是不可以遍历的。
8、Object.prototype.hasOwnProperty():返回一个布尔值,用于判断某个属性定义在对象自身,还是定义在原型链上。
注:hasOwnProperty方法时JavaScript中唯一一个处理对象属性时,不会遍历原型链的方法。
9、in运算符:返回一个布尔值,表示一个对象是否具有某个属性,它不区分该属性是对象自身的属性,还是继承的属性。 in运算符常用于检查一个属性是否存在。
10、对象的拷贝:如果要拷贝一个对象,需要做到下面两件事情:(1)确保拷贝后的对象,与原对象具有同样的原型。
(2)确保拷贝后的对象,与原对象具有同样的实例属性。
function copyObject(orig) {
var copy = Object.create(Object.getPrototypeOf(orig));
copyOwnPropertiesFrom(copy, orig);
return copy;
}
function copyOwnPropertiesFrom(target, source) {
Object
.getOwnPropertyNames(source)
.forEach(function (propKey) {
var desc = Object.getOwnPropertyDescriptor(source, propKey);
Object.defineProperty(target, propKey, desc);
});
return target;
}