Object.getPrototypeOf()
返回参数对象的原型
function F(){};
var f = new F();
Object.getPrototypeOf(f) === F.prototype; // true
几种特殊对象的原型
// 空对象的原型
Object.getPrototypeOf({}) === Object.prototype; // true
// Object.prototype
Object.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. 生成一个不继承任何属性的对象
```javascript
Object.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));
}