javascript 中Object记录

对于简简单单的js中的object,相比对于了解js的人来说都应该有不少的看法吧,对于后台的童鞋们来说,“什么是对象,一切皆对象”,其实不然,在js中,对象也很是简单的。下面摘自mdn

Object构造函数的方法

Object.assign()
通过复制一个或多个对象来创建一个新的对象。
Object.create()
使用指定的原型对象和属性创建一个新对象。
Object.defineProperty()
给对象添加一个属性并指定该属性的配置。
Object.defineProperties()
给对象添加多个属性并分别指定它们的配置。
Object.entries()
返回给定对象自身可枚举属性的[key, value]数组。
Object.freeze()
冻结对象:其他代码不能删除或更改任何属性。
Object.getOwnPropertyDescriptor()
返回对象指定的属性配置。
Object.getOwnPropertyNames()
返回一个数组,它包含了指定对象所有的可枚举或不可枚举的属性名。
Object.getOwnPropertySymbols()
返回一个数组,它包含了指定对象自身所有的符号属性。
Object.getPrototypeOf()
返回指定对象的原型对象。
Object.is()
比较两个值是否相同。所有 NaN 值都相等(这与==和===不同)。
Object.isExtensible()
判断对象是否可扩展。
Object.isFrozen()
判断对象是否已经冻结。
Object.isSealed()
判断对象是否已经密封。
Object.keys()
返回一个包含所有给定对象自身可枚举属性名称的数组。
Object.preventExtensions()
防止对象的任何扩展。
Object.seal()
防止其他代码删除对象的属性。
Object.setPrototypeOf()
设置对象的原型(即内部[[Prototype]]属性)。
Object.values()
返回给定对象自身可枚举值的数组。

使用new操作符来创建对象时,

var o = new Object(true) //其等价于=>var o  = new Boolean(true)

var o = new Object(Boolean()) // 等价于=>var o = new Boolean(false)

对于创建对象,我们可以使用字面量的方式来创建eg:var obj = {};也可以使用new操作符来创建对象eg:var obj = new Object();还可以使用Object中提供的方法create来复制对象eg:var obj = Object.create({})

给定对象赋值,我们一般使用字面量的形式eg:var obj = {name:"jack"}  obj.age = 22,还有其他的形式,eg:Object.defineProperty(obj,"habby",{value:"game",enumerable:true,configurable:true,writable:true}) 来单个赋值于某个对象obj,当然还可以赋值多个,使用Object.defineProperties(obj,{'link':{value:'www.eg.com',enumerable:true,configurable:true,writable:true},'money':{value:'1w',configurable:true}}),你可能注意到,每次以这种方式设置值的时候都有将其writable,configurable,enmuerable这三个值都设置成true,这是因为以这种方式给obj定义赋值时这几个属性默认是false,我们可以通过Object.getOwnPropertyDescriptor(obj,'name')来查看到该属性的相关配置

eg:

Object.defineProperty(obj,'name',{})
//{name: undefined}
Object.getOwnPropertyDescriptor(obj,'name')
//{value: undefined, writable: false, enumerable: false, configurable: false}

在定义obj的时候,还可以定义setter,getter来存取数据(当定义setter跟getter的时候,configurable必须是true或者writable为true,不能有value值)

var obj = Object.defineProperty({}, 'p', {
  get: function () {
    return 'getter';
  },
  set: function (value) {
    console.log('setter: ' + value);
  }
});

obj.p // "getter"
obj.p = 123 // "setter: 123" 当其obj.p赋值时将会调用set方法,取值时调用get方法
字面量的方式:
var o = {
  property: function ([parameters]) {},
  get property() {},
  set property(value) {}
};

在使用Object.preventExtensions时还是有限制的

var obj = new Object();
Object.preventExtensions(obj);

var proto = Object.getPrototypeOf(obj);
proto.t = 'hello';
obj.t //hello

解决办法:

var obj = new Object();
Object.preventExtensions(obj);

var proto = Object.getPrototypeOf(obj);
Object.preventExtensions(proto);

proto.t = 'hello';
obj.t // undefined 如果对象中的值也是一个对象的时候:
var obj = {
  foo: 1,
  bar: ['a', 'b']
};
Object.freeze(obj);

obj.bar.push('c');
obj.bar // ["a", "b", "c"] 这也是其中的一点局限性
百度已收录
分享