Object.create()的使用总汇:创建对象,参数说明,兼容性的实现
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__);//trueObject.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()对传入其中的对象执行了一次浅复制。
本文内容仅供个人学习/研究/参考使用,不构成任何决策建议或专业指导。分享/转载时请标明原文来源,同时请勿将内容用于商业售卖、虚假宣传等非学习用途哦~感谢您的理解与支持!