javaScript对象,属性整理

来源:互联网 发布:java报表框架 编辑:程序博客网 时间:2024/05/16 08:34

js中共有7种语言类型,其中基础的类型 有6种,string、number、undefined、boolean、null、symbol,复杂的类型有object,js中还有一些内置对象,其实这些对象是一些内置的构造函数,例如Array、Object、Reg、Data、Function、Number、String、Boolean、Error。
当创建一个字符串变量或者数值变量时,该变量可以调用一些方法,这是因为js解析引擎,自动把自变量转化成相应的构造对象,所以可以访问相应的对象的方法和属性。对于使用typeof判断变量的类型时,typeof null;//object,出现这个结果是因为不同的对象在js底层中被储存为二进制形式,当二进制的前三位是0时,判断即为对象,而null的二进制表示均为0,故被判断为对象。正则表达式,使用typeof进行判断时,在safari5以下,和chrome7以下版本,会返回function,因为ECMA-262规定,对象内部有[[ call ]]的方法,typeof会返回function,IE和FireFox中会返回object。

对象的属性具有可描述属性,value、writable、configurable、enumerable,获取该属性的描述属性的方法是,

Object.getOwnPropertyDescriptor(对象,"属性名");

创建属性时,也可以修改对象的属性的描述属性,

Object.defineProperty(对象,"属性名",     {writable:true,//可写     configurable:true,//可配置     enumerable:true,//可枚举     value:"属性值"});//只允许每次定义一个属性Object.defineProperties(对象,{  a:{value:"a"},  b:{value:"b",writable:true},  c:{get function(){ return this._c_},     set function(val){if(val>0){this._c_ = val}}  }})

以下均为严格模式下情况,当writable属性值为false时,改属性值不可以更改否则会报错,当configurable值修改为false时,属性的可写属性(writable)可以由true改成false,不可逆向更改,其余的配置也是不允许的,不可以用delete删除属性,会显示false。
1.如若想创建一个属性不可修改,重定义,不可删除的对象可以设置其writable、configurable属性为false
2.如若想禁止对象创建新的属性,且保留已有属性,可以使用Object.preventExtensions(对象)。
3.Object.seal()会创建一个对象,该对象不可以添加属性,且也不可以配置或删除现有属性值等。这个方法实际上就是调用了Object.seal()和Object.preventExtensions()
4.Object.freeze(),该方法在Object.seal()的基础上,将writable属性设置为false,调用了该方法,该对象不可以添加属性,不可以删除或修改、或配置现有属性。

对象中隐藏的[[ get ]]、[[ put ]],在调用或查找对象的属性时,会使用[[ get ]]操作,设置属性时,[[ put ]]会进行以下操作,
1. 属性是否是访问描述符?如果是并且存在setter 就调用setter。
2. 属性的数据描述符中writable 是否是false ?如果是,在非严格模式下静默失败,在严格模式下抛出TypeError 异常。
3. 如果都不是,将该值设置为属性的值。
当属性定义为getter、或setter中的任意一个,该属性会被定义为访问属性,对于访问描述符来说,JavaScript 会忽略它们的value 和writable 特性,取而代之的是关心set 和get(还有configurable 和enumerable)特性
可以通过如下方式设置

var obj = {get a(){return 2}};obj.a;//2Object.defineProperty(obj,"b",{get:function(){return this.a*2}});

通过getter创建的属性,不可以使用字面量形式进行修改,修改不会生效。
所以通常情况下,get和set属性是成对出现的,如下:

var obj = {get a(){return this._a_},set a(val){this._a_= val}}

当设置对象的属性为不可枚举时,使用for in 遍历对象的属性,将不会获取不可枚举的属性名,判断对象的属性名是否是可枚举,可使用以下

对象.propertyIsEnemurable("属性名");//该方法会检查对象本身的属性是否是可枚举的,而不检查原型链Object.keys(对象);//返回该对象本身的可枚举属性名构成的数组Object.getOwnPropertyNames(对象名);//返回该对象本身的所有属性,无论是否可枚举对象.hasOwnProperty("属性名");//检查对象本身,无论是否可枚举属性,只是检查该对象是否具有该属性属性名 in 对象;//检查对象的原型链上是否有该属性,无论是否枚举,for 属性名 in 对象 ;//返回对象原型链上所有可枚举的属性名称

ES6数组对象新增方法for of 遍历数组对象,实际上是for..of 循环首先会向被访问对象请求一个迭代器对象,然后通过调用迭代器对象的next() 方法来遍历所有返回值。数组有内置的@@iterator,因此for..of 可以直接应用在数组上。我们使用内置的@@iterator 来手动遍历数组,看看它是怎么工作的

Object.defineProperty( myObject, Symbol.iterator, {    enumerable: false,    writable: false,    configurable: true,    value: function() {        var o = this;        var idx = 0;        var ks = Object.keys( o );        return {            next: function() {                  return {                      value: o[ks[idx++]],                      done: (idx > ks.length)                  };           }       };   }})

参考文献:你不知道的js(上)

原创粉丝点击