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

时间: 2018-01-02阅读: 1829标签: 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

js中的Object.defineProperty()和defineProperties()

Object.defineProperty()该方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象,Object.defineProperties()该方法直接在一个对象上定义新的属性或修改现有属性,并返回该对象

Object构造函数的方法 之 Object.freeze

Object.freeze( obj )可以 冻结 一个对象。一个被冻结的对象再也不能被修改;冻结了一个对象则不能向这个对象添加新的属性,不能删除已经属性

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

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

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

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

Js Object.freeze和Object.seal

本文实例讲述了JS Object.preventExtensions(),Object.seal()与Object.freeze()用法。分享给大家供大家参考,Object.preventExtensions 只能阻止一个对象不能再添加新的自身属性,仍然可以为该对象的原型添加属性。

js对象object

访问对象属性的两种方法:a:objectName.PropertyName 对象名.属性名;This关键字:在普通函数下This指向的是window;对象的创建方法:通过对象字面量的形式创建对象

Object.keys与Object.hasOwnProperty的使用

hasOwnProperty()方法会返回一个布尔值,指示对象自身属性 (忽略原型链) 中是否具有指定的属性,语法: obj.hasOwnProperty(prop),参数prop: 要检测的属性的 String 字符串形式表示的名称,或者 Symbol

Object.keys方法

Object.keys() 方法会返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和使用 for...in 循环遍历该对象时返回的顺序一致 。

为什么你应该使用 Object.is() 进行相等性比较

因此Javascript提供了三等运算符,三等运算符更加严格并且不会将操作数进行强制类型转换。然而三等运算符也不是最好的解决方案,也存在问题

Object.defineProperty

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

点击更多...

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