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(上)
- javaScript对象,属性整理
- javascript window对象属性整理
- javascript window对象属性整理
- JavaScript对象宽度高度属性整理
- javascript中的Array对象属性和方法整理
- javascript中的Array对象属性和方法整理
- JavaScript对象整理
- javascript 面向对象整理
- javascript面向对象整理
- JavaScript[对象.属性]集锦
- JavaScript[对象.属性]集锦
- JavaScript 的对象属性
- JavaScript[对象.属性]集锦
- JavaScript[对象.属性]集锦
- JavaScript[对象.属性]
- JavaScript[对象.属性]集锦
- JavaScript[对象.属性]集锦
- JavaScript[对象.属性]集锦
- nodemcu 8266修改DS18B20温度传感器分辨率
- 大数据分析实用工具
- js方法无效没有进入方法
- trafficserver事件驱动机制
- c++ const的实现原理
- javaScript对象,属性整理
- 获取前一周的日期
- 如何拿取微信企业号人员的完整部门
- C++中sprintf()函数应用
- 16年程序员平均工资122478元_你拖后腿了没?
- MySql为查询结果添加前、后缀
- C语言基础之数组
- 6.5世界环境日!来聊聊那些你想不到的环保黑科技?
- android 文件工具类