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

时间: 2018-01-02阅读: 1695标签: 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()对传入其中的对象执行了一次浅复制。


站长推荐

1.云服务推荐: 国内主流云服务商,各类云产品的最新活动,优惠券领取。地址:阿里云腾讯云华为云

链接: http://www.fly63.com/article/detial/300

Object.assign实现浅拷贝的原理

什么是浅拷贝?浅拷贝就是创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。浅拷贝Object.assign()是什么?主要将所有可枚举属性的值从一个或者多个数据源对象复制到目标对象,同时返回目标对象。

javascript中Object常用方法使用总结

Object构造函数-继承:只有构造函数才有prototype属性,js每个对象都有一个__proto__属性 === 构造函数的prototype属性,Object.assign()用于将一个或者多个对象的可枚举的值从源对象复制到目标对象。返回目标对象

Object.defineProperty

想到Object.defineProperty,首先不得不提到对象,对象是JavaScript的基础,有一种常见的说法“JavaScript中万物皆是对象”。这种说法其实并不那么准确,根据 JavaScript 对语言类型的分类

Object构造函数的方法 之Object.entries()

返回一个给定对象自身可枚举属性的键值对数组,其排列与使用 for…in循环遍历该对象时返回的顺序一致(区别在于for…in循环也枚举原型链中的属性)

JavaScript V8 Object 内存结构与属性访问详解

随着网景浏览器的发行,JavaScript 首次进入人们的视线。之后随着 AJAX 的大规模应用与富客户端、单页应用时代的到来,JavaScript 在 Web 开发中占据了越来越重要的地位。在早期的 JavaScript 引擎中,性能越发成为了开发网页应用的瓶颈

Js中Object对象的理解,Object常用的属性和方法有哪些?

在JavaScript中的所有对象都是继承Object对象而来的, 我们可以理解为Object是所有js对象通用的功能,讲解Object的prototype属性、Object.prototype属性和方法?Object.prototype.constructor属性等

object 类型 和 字符串索引签名类型的点属性

TypeScript 2.2 引入了一个新的 object 类型。它表示任何非基本类型。以下是 JS 的基本类型:string、boolean、number、bigint

Javascript中的object相等

相等是JavaScript中起初最让人困惑的部分。==和===的比较、强制类型的顺序等等,都使得这个问题变得复杂。今天,我们会聚焦另一个方面:object相等是如何实现的。

如何理解Object.defineProperty()?

几乎所有使用Vue的开发者都知道,Vue的双向绑定是通过Object.defineProperty()实现的,也知道在getter中收集依赖,在setter中通知更新。那么除了知道getter和setter之外,Object.defineProperty()还有哪些值得我们去注意的地方呢?

JavaScript中的Object.create的模拟实现

不难看出来,其实Object.create只是对对象的一个浅复制,在修改引用类型的属性时,所有属性都会被修改。这是由于Object.create的实现机制,只是利用new,相当于是在中间加了一个中间层,从图中也可以看到,多了一个__proto__指向原对象。

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!