Object.create()的使用总汇:创建对象,参数说明,兼容性的实现

时间: 2018-01-02阅读: 225标签: Object

Object.create()的含义和语法

Object.create()是E5的一个新特性,用于创建一个具有指定原型且可选择性地包含指定属性的对象,其实可以理解为继承一个对象。

Object.create(prototype, descriptors)
//prototype:必需。 要用作原型的对象,如果没有则传为 null。
//descriptors:可选。 包含一个或多个属性描述符的 JavaScript 对象。


Object.create()创建新对象

1、创建null原型的对象  

var newObj = Object.create(null, {
  name: {
       value: "newObj",
       enumerable: true,
   }, 
});
console.log(newObj);//{name: "newObj"}

说明:使用null创建的是一个空对象,不会具备Object.prototype 原型链上的属性或者方法,比如toString()和valueOf()。通过设置enumerable:true来表明newObj的name属性为可枚举的,其值为newObj。

2、创建一个普通的空对象

var obj1=Object.create(Object.prototype);

这样创建的对象等价于:

var obj2={};
var obj3=new Object();
console.log(obj1.__proto__===obj2.__proto__);//true
console.log(obj1.__proto__===obj3.__proto__);//true


Object.create()第二个参数说明:

1、数据属性:

writable:是否可任意写,表示能否修改value值
configurable:是否可配置,表示能否通过delete删除属性从而重新定义属性
enumerable:是否可枚举,能用 for in 枚举
value:值

2、访问属性:

configurable:是否可配置,表示能否通过delete删除属性从而重新定义属性
enumerable:是否可枚举
get:在读取属性时调用的函数,默认是undefined
set:在写入属性时调用的函数,默认是undefined  

3、例如:

var obj = {
    a:function(){
        console.log('a');
    },
}
var newObj= Object.create(obj,{
    n1:{
        value:'n1',
        writable:false,//不可写
        configurable: false,//不可删除属性从而重新定义属性;
    },
    n2: {
        configurable: false,
        get: function() { return n2; },
        set: function(value) { n2=value }
    } 
})
console.log(newObj.a());//输出a
console.log(newObj.n1);//输出n1
newObj.n1='hellow'
console.log(newObj.n1);//输出n1,这里由于设置了writable:false,//不可写,所以修改不了newObj.n1它的值
newObj.n2='haha';
console.log(newObj.n2);

Object.defineProperty(newObj,'n1',{
    configurable: true,
    enumerable: true,
});//报错:Uncaught TypeError: Cannot redefine property: n1

可以看出:我们可以通过Object.defineProperty方法重新修改属性,但是如果将configurable设置为false,将不能再调用Object.defineProperty()对属性的行为进行修改,除了writable 只能修改为 false。


Object.create()的兼容性

Object.create在某些浏览器没有支持,需要给出Object.create的兼容实现:

// 参考JavaScript高级程序设计中的原型式继承​
Object.prototype.create = function(obj) {
if(Object.prototype.create){
return Object.prototype.create //特性检测,判断浏览器是否兼容
}else{
function F(){ F.prototype = obj; //以传入参数为原型构造对象
return new F(); } } };

说明:

Object()函数内部先创建了一个临时性的构造函数,然后将传入的对象作为这个构造函数的原型,最后返回了这个临时类型的新实例。
从本质上讲object()对传入其中的对象执行了一次浅复制。