Object.create()创建一个新的对象
2017-05-11 21:19

Object.create()

Object.create()方法接受两个参数,第一个参数是原型,第二个参数是对象的属性的key:value键值对对象,其中第二个参数的属性定义跟Object.definePropeties()方法定义对象的属性一样。第一个参数是必须的,第二个参数是可选的,也就是说我们由一个原型定义一个空属性的对象。

var twoline=Object.create({},{
    name:{value:"mooshine"},
    age:{
        writable:false,configurable:true,value:25,enumerable:true
    }
});
console.log(twoline);

打印结果如下:

blob.png

其中对于属性的定义,必须是使用属性的描述符形式进行定义,像下面这种定义方式直接写属性值是错误的:

var twoline=Object.create({},{
    name:"mooshine",
    age:{
        writable:false,configurable:true,value:25,enumerable:true
    }
});
console.log(twoline);

浏览器对于这段代码会报错:

blob.png

所以必须使用属性描述符的形式进行属性的定义。

同时在使用Object.create()方法创建一个对象的时候,它的原型也可以是null,像下面这样

var twoline=Object.create(null,{
    name:{value:"mooshine"},
    age:{
        writable:false,configurable:true,value:25,enumerable:true
    }
});
console.log(twoline);

打印结果如下:

blob.png

这个对象缺少了“__proto__”属性。

这里捎带说一下属性的描述符中,value和getter,setter是不能同时出现的。

var twoline=Object.create(null,{
    name:{value:"mooshine"},
    age:{
        writable:false,configurable:true,value:25,enumerable:true
    },
    sex:{
        value:"male",
        get:function(){return this.value},
        set:function(val){this.value=val}
    }
});
console.log(twoline);

这段代码会报错:

blob.png

所以,我们要么单独使用value结合writable,或者单独使用getter,setter属性方法,这里的writable和getter,setter也是不能同时出现的,错误跟value跟getter,setter同时出现时的错误一样。

可是我们想要使用getter,setter方法在赋值值时做一些处理,又想让获取值时像使用value似的有一个默认值,那么我们可以像下面这样来实现:

var twoline=Object.create(null,{
    name:{value:"mooshine"},
    age:{
        writable:false,configurable:true,value:25,enumerable:true
    },
    sex:{
        get:function(){return this.value||"male"},
        set:function(val){this.value=val;}
    }
});

注意一点,这里的this.value中的this指向的是twoline这个对象,我们在getter,setter方法中这样写其实是在twoline对象上添加了一个value的属性值,当然你可以在使用Object.create()方法定义对象时使用局部变量来替代getter,setter中的this.value。


原创文章,转载请注明来自:妹纸前端-www.webfront-js.com.
阅读(1470)
辛苦了,打赏喝个咖啡
微信
支付宝
妹纸前端
妹纸前端工作室 | 文章不断更新中
京ICP备16005385号-1