js中属性类型分为两种:数据属性和访问器属性

在js中,对象都是由名值对构成的,名:就是我们所说的属性名,值就是属性对应的值(基本值、对象、方法)。

ECMA-262第5版定义了只有内部才用的特性,描述了属性的各种特征,比如,这个属性能否被删除、能否被枚举、能否被修改、以及读取属性的值。

这些特性是为了实现JavaScript引擎用的,因此在JavaScript中不能直接访问他们。

1、先来说一下数据属性

数据属性:包含一个数据值的位置。在这个位置可以读取和写入值。数据属性有4个描述其行为的特性。

Configurable:表示能否通过delete删除属性,从而重新定义属性,能否修改属性的特性,或则能否把属性修改为访问器属性。我们一般在对象上自定义的属性,它们的这个特性一般为true。

Enumberable:表示能否通过for-in循环返回属性(枚举),自定义的对象属性,默认值为true。

Writable:表示能否修改属性的值,自定义对象的属性,这个特性值默认为true。

Value:包含这个属性的数据值,读取属性值的时候从这个读,写入属性值的时候,把新值保存在这个位置。这个特性的默认值为undefined。

ECMAScript5定义了一个修改属性的这些默认特性的方法:Object.defineProperty();

这个方法接收三个参数:属性所在的对象、属性的名字(字符串形式)、一个描述符对象。其中描述符对象的属性必须是:configurable、enumberable、writable、value,设置其中的一个或多个值,可以修改对应的特性值。例如:

    var person={};
Object.defineProperty(person,"name",{
writable:false,
value:"Nicholas"
});
console.log(Object.getOwnPropertyDescriptor(person,"name"));//读取属性的特性的方法,后面会介绍
console.log(person.name);//Nicholas
person.name="Greg";
console.log(person.name);//Nicholas

上面,对name属性的两个特性writable、value进行了设置,可见,我们更改name属性的值是无效的,在严格模式下会报错;

当用Object.defineProperty()创建一个新属性时,若不指定configurable、enumberable、writable这些特性时,都是false,若果在原来设置过的基础上设置其中的一个或多个,则无此限制。

另外,当设置configurable为false后,也就是把该属性变成不可设置的,除delete不能删除该属性外,再次用Object.defineProperty()方法设置除writable特性外的其它特性时,在非严格模式时什么都不会发生,在严格模式时会报错。(同时configurable特性也设置不了true了!!!);

2、访问器属性:

访问器属性不包含数据值,他们包含一对儿getter和setter函数(不过,这两个函数都不是必须的)。在读取访问器属性时,会调用getter函数,这个函数负责返回有效的值;在写入访问器属性时,会调用setter函数并传入新值,这个函数负责决定如何处理数据。访问器属性有如下4个特性。

configurable:表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或则能否把属性修改为数据属性。对于直接在对象上定义的属性,这个特性的默认值为true。

enumberable:表示能否通过for-in来循环返回属性。对于直接在对象上定义的属性,这个特性的默认值为true。

get:读取属性时调用的函数。默认值为undefined

set:在写入属性时调用的函数。默认值为undefined

访问器属性不能直接定义,必须使用Object.defineProperty()来定义。请看下面的例子:

    var book={
_year:2004,
edition:1
};
//下边给book对象设置一个year(访问器属性)
Object.defineProperty(book,"year",{
get:function(){
return this._year;
},
set:function(newValue){
if(newValue>2004){
this._year=newValue;
this.edition=newValue - 2004;
}
}
});
book.year =2005;
console.log(book.edition);//1
console.log(book._year);//2005
console.log(book.year);//2005
console.log(book);//{_year: 2005, edition: 1}

可见,创建的访问器属性,用console是打印不出来的,我们常见的使用访问器属性的方式就是上述这种方式,修改访问器属性,会导致其他属性变化!!!

当然,不一定非要指定get和set,只指定get就是只能读,不能写,只指定set就是不能读。

当然也可以同时定义多个属性,用:Object.defineProperties()方法,利用这个方法可以通过描述符一次定义多个属性,这个方法接收两个参数,第一个参数是要添加和修改其属性的对象,第二个参数(对象:描述符)的属性与第一个对象中要添加或修改的属性要一一对应。如:

    var book={};
Object.defineProperties(book,{
_year:{//定义一个数据属性,其它为指定的特性值为false
writable:true,
value:2004
},
edition:{//同样是一个数据属性
writable:true,
value:1
},
year:{
get:function(){
return this._year;
},
set:function(newValue){
if(newValue>2004){
this._year=newValue;
this.edition+=newValue-2004;
}
}
}
});
book.year=2003;
console.log(book);//{_year: 2004, edition: 1}
book.year=2005;
console.log(book);//{_year: 2005, edition: 1}
// Object.getOwnPropertyDescriptor();用来读取给定属性的描述符,这个方法有两个参数,属性所在的对象和要读取其描述符的属性名,返回一个对象。
var descriptor=Object.getOwnPropertyDescriptor(book,"_year");//数据属性
var descriptor2=Object.getOwnPropertyDescriptor(book,"year");//访问器属性
console.log(descriptor);//{value: 2005, writable: true, enumerable: false, configurable: false}
console.log(descriptor2);//{get: ƒ, set: ƒ, enumerable: false, configurable: false}
Object.getOwnPropertyDescriptor();用来读取给定属性的描述符,这个方法有两个参数,属性所在的对象和要读取其描述符的属性名,返回一个对象。这个方法可以在任何浏览器使用。

js中属性类型:数据属性与访问器属性的更多相关文章

  1. ECMAScript中有两种属性:数据属性和访问器属性。

    ECMA-262定义这些特性是为了实现JavaScript引擎用的,因此在JavaScript中不能直接访问它们.为了表示特性是内部值,该规范把它们放在了两对儿方括号中,例如 [[Enumerable ...

  2. JavaScript对象的两类属性(数据属性与访问器属性)

    对JavaScript来说,属性并非只是简单的名称和值,JavaScript用一组特征(attribute)来描述属性 (property). 第一类属性数据属性具有四个特征. value:就是属性的 ...

  3. JavaScript 数据属性和访问器属性

    在JavaScript中对象被定义为"无序属性的集合,其属性可以包含基本值.对象或函数."通俗点讲,我们可以把对象理解为一组一组的名值对,其中值可以是数据或函数. 创建自定义对象通 ...

  4. javascript对象属性——数据属性和访问器属性

    ECMA-262第五版在定义时,描述了属性property的各种特征,定义这些特性是为了实现javascript引擎用的,为了表示该特性是内部值,规范把它们放在了两对儿方括号中,例如[[Enumera ...

  5. Js中的数据属性和访问器属性

    Js中的数据属性和访问器属性 在javaScript中,对象的属性分为两种类型:数据属性和访问器属性. 一.数据属性 1.数据属性:它包含的是一个数据值的位置,在这可以对数据值进行读写. 2.数据属性 ...

  6. ECMAScript 5中的数据属性和访问器属性

    简介 ECMAScript 定义的对象中有两种特殊的属性, 这两种特殊的属性在你定义对象属性时就会赋予, 我们在必要时可以改写这两种特殊的属性让其属性的访问更加的合理化, 这两种特殊的属性称呼及作用如 ...

  7. JavaScript 属性类型(数据属性和访问器属性)

    数据属性 数据属性包含一个数据值的位置.在这个位置可以读取和写入值.数据属性有 4 个描述其行为的特性. [[Configurable]]:表示能否通过 delete 删除属性从而重新定义属性,能否修 ...

  8. JavaScript中的数据属性和访问器属性

    在学习JavaScript原型(prototype)和原型链(prototype chain)知识的时候,发现数据属性和访问器属性的重要性,通过不断的查找相关知识,浅显理解如下,若有差错,希望不吝赐教 ...

  9. JS的数据属性和访问器属性

    ECMA-262第5版在定义只有内部才用的特性(attribute)时,描述了属性(property)的各种特征.ECMA-262定义这些特性是为了实现javascript引擎用的,因此在javasc ...

随机推荐

  1. Vue.js常用指令:v-for

    一.什么是v-for指令 在Vue.js中,我们可以使用v-for指令基于源数据重复渲染元素.也就是说可以使用v-for指令实现遍历功能,包括遍历数组.对象.数组对象等. 二.遍历数组 代码示例如下: ...

  2. ZeroMQ总结

    Socket types Thread safety: ZeroMQ的socket是非线程安全的,并且ZeroMQ本身不建议在多个线程中传递同一个Socket,即使保证了线程同步.   Socket ...

  3. Ubuntu14.04下安装MATLAB后,通过命令行打开其图形界面

    安装的是Matlab R2017a,使用的是默认安装目录,安装在目录/usr/local/MATLAB/R2017a/bin中.那么安装完成之后系统不会给Matlab添加系统路径,只有把终端切换到安装 ...

  4. 删除新版UniAccess Agent 办公室监控软件的方法

    UniAccess Agent 是在由LeagSoft开发的监控软件,老版本的一般安装在C:\Program Files\LeagSoft\UniAccess Agent这个目录下,一般找到这个目录点 ...

  5. Qt编写的开源帖子集合(懒人专用)

    回顾自己学习Qt以来九年了,在这九年多时间里面,从本论坛学习不到不少的东西,今天特意整了一下自己开源过的资源的帖子,整理一起方便大家直接跳转下载,不统计不知道,一统计吓一跳,不知不觉开源了这么多代码, ...

  6. LeetCode - 386. Lexicographical Numbers

    Given an integer n, return 1 - n in lexicographical order. For example, given 13, return: [1,10,11,1 ...

  7. Windows-NTFS-ADS在渗透测试中的利用

    0.什么是ADS Windows:微软公司的一款视窗操作系统,其内核为WindowsNT. NTFS:WindowsNT环境的限制级专用文件系统. ADS:NTFS的系统特性,交换数据流(Altern ...

  8. 关于思科C2950交换机清除密码,恢复初始配置的方法

    上个月河南做项目,因需要大批量的对服务器进行操作系统的安装,于是想到了PXE网络批量安装, 好不容易到机房的仓库找到网线及一台思科交换机,但到安装的时候,发现思科交换机里应该有配置了 通过配置线连接交 ...

  9. hadoop Codec

  10. 有关 PHP 的 10 道问题

    1.简述面向对象的三大特性 答:封装 --  继承  --  多态 封装的目的:为了让类更安全 继承的概念:子类可以继承父类的一切 多态的概念:当父类引用指向子类实例,由于子类里面对父类的方法进行了重 ...