在JavaScript中对象被定义为"无序属性的集合,其属性可以包含基本值、对象或函数。"通俗点讲,我们可以把对象理解为一组一组的名值对,其中值可以是数据或函数。
创建自定义对象通常有两种方法,第一种就是创建一个Object的实例,然后再为其添加属性和方法,例如:
var person = new Object(); person.name = "Scott"; person.age = 24; person.sayName = function(){ alert(person.name); }
第二种方法即对象字面量法,一般推荐使用这种方法创建对象,例如:
var person = { name: "Scott", age: 24, sayName: function(){ alert(this.name); } }
属性类型
JavaScript中定义了两种不同的属性:数据属性和访问器属性。数据属性一般用于存储数据数值,而访问器属性一般进行get/set操作,不能直接存储数据数值。在ES5中,我们为了描述属性(property)的各种特征,定义了特性(attribute)。在JavaScript中不能直接访问特性,我们把它放在两对方括号中,例如[[Enumerable]]。
•数据属性
数据属性主要有四个特性描述其行为:
1.[[Configurable]]:默认为true。表示能否通过delete删除属性从而重新定义属性,能否修改属性特性,或者能否把属性修改为访问器属性;
2.[[Enumerable]]:默认为true。表示能否通过for-in循环返回属性;
3.[[Writable]]:默认为true。表示能否修改属性的值。
4.[[Value]]:默认值为undefined。表示包含属性的数据值。读写属性值都从这个位置进行。
对于上面直接在person对象上定义的属性,它们的[[Configurable]]、[[Enumerable]]、[[Writable]]特性都被默认设置为true,而[[Value]]特性被设置为特定值。如果想要修改属性默认的特性,可以使用ES5提供的Object.defineProperty()方法,这个方法接收三个参数:属性所在对象、属性的名字和一个描述符对象。描述符对象只能包含上述四个特性的一个或多个。例子如下:
var person = { name: "Scott" } Object.defineProperty(person,"name",{ writable:false; }) console.log(person.name); //"Scott" person.name = "Evan"; console.log(person.name); //"Scott"
将person对象name属性的特性writable设置为false,此属性的值为不可修改的,因此对该属性的复制操作会直接忽略。
var person = { name: "Scott" } Object.defineProperty(person,"name",{ configurable:false; }) console.log(person.name); //"Scott" delete person.name; console.log(person.name); //"Scott"
可以看到,当把name属性的特性值configurable设置为false之后,就表示不能从对象中删除属性。但需要注意的是,当把属性定义为不可配置之后,就不能把它变回可配置的了。此时修改除writable之外的其它特性都会报错,例如:
var person = { name: "Scott" } Object.defineProperty(person,"name",{ configurable:false; }) Object.defineProperty(person,"name",{ configurable:true; //此处会抛出错误 })
也就是说,在把configurable特性修改为false之后,再修改其它特性就会有限制存在。
•访问器属性
访问器属性不包含数据值。它包含一对getter和setter函数。当读取访问器属性时,会调用getter函数并返回有效值;当写入访问器属性时,会调用setter函数并传入新值,setter函数负责处理数据。该属性有四个特性:
1.[[Configurable]]:默认为true。表示能否通过delete删除属性从而重新定义属性,能否修改属性特性,或者能否把属性修改为访问器属性;
2.[[Enumerable]]:默认为true。表示能否通过for-in循环返回属性;
3.[[Get]]:读取属性时调用的函数,默认为undefined;
4.[[Set]]:写入属性时调用的函数,默认为undefined。
访问器属性不能直接定义,必须通过Object.defineProperty()函数定义,例如:
var person = { _name: "Scott", _age: 24, _tel: 86247 }; //name属性为只读的 Object.defineProperty(person,"name",{ get: function(){ return this._name; } }); //age属性为只写不可读的 Object.defineProperty(person,"age",{ set: function(p){ this._age = p; } }); //tel属性为可读可写的 Object.defineProperty(person,"tel",{ get:function(){ return this._tel; }, set: function(p){ this._tel = p; } }); console.log(person.name); //"Scott" person.name = "Evan"; console.log(person.name); //"Scott",对name属性的修改无效 console.log(person.age); //undefined,不可读属性 person.age = 25; console.log(person._age); //25,已经修改 console.log(person.tel); //"86247",可读属性 person.tel = "13975"; console.log(person.tel); //"13975",可以修改
属性前面的下划线表示只能通过对象方法访问的属性。当我们使用person.name时实际上调用的是name属性的getter函数,为person.name赋值时调用的是name属性的setter函数,这样属性和访问器之间的关系就很清晰了。
定义多个属性
实际上ES5为我们提供了为一个对象定义多个属性的方法,即Object.defineProperties(),该函数接收两个参数,属性所在的对象以及需要修改的属性及其描述符对象组成的对象,例如把上边的例子修改为一次性定义多个属性,如下:
var person = { _name: "Scott", _age: 24, _tel: 86247 }; Object.defineProperties(person,{ name:{ get: function(){ return this._name; } }, age:{ set: function(p){ this._age = p; } }, tel:{ get:function(){ return this._tel; }, set: function(p){ this._tel = p; } } });
读取属性的特性
ES5提供了Object.getOwnPropertyDescripter()方法来获取给定属性的描述符。该方法接收两个参数:属性所在的对象和要读取其描述符的属性名称。结果会返回一个对象,如果是访问器属性,返回的对象有configuable、enumerable、get和set;如果是数据属性,这个返回对象的属性包括configuable、enumerable、writable和value。对于上面的例如,使用如下:
var person = { _name: "Scott", _age: 24, _tel: 86247 }; Object.defineProperties(person,{ name:{ get: function(){ return this._name; } }, age:{ set: function(p){ this._age = p; } }, tel:{ get:function(){ return this._tel; }, set: function(p){ this._tel = p; } } }); var descripter = Object.getOwnPropertyDescripter(person,"tel"); console.log(descripter.value); //undefined console.log(descripter.enumerable); //false console.log(typeof descripter.get); //"function"
上面的代码中获取了person对象的tel属性,由于其是一个访问器属性,所以其value为undefined,enumerable为false,而get为指向getter函数的一个指针。
以上这篇浅谈JavaScript 数据属性和访问器属性就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持小牛知识库。
本文向大家介绍浅谈javascript 函数属性和方法,包括了浅谈javascript 函数属性和方法的使用技巧和注意事项,需要的朋友参考一下 每个函数都包含两个属性:length 和 prototype length:当前函数希望接受的命名参数的个数 prototype:是保存他们所有实力方法的真正所在 每个函数都包含两个非继承而来
本文向大家介绍浅谈javascript 函数内部属性,包括了浅谈javascript 函数内部属性的使用技巧和注意事项,需要的朋友参考一下 在函数内部有两个特殊的属性:arguments 和 this。arguments是一个类数组对象,包含传入的所有参数, 但是这个对象还有一个名叫callee的属性,该属性是一个指针,指向拥有这个arguments对象的函数。
本文向大家介绍浅谈JS使用[ ]来访问对象属性,包括了浅谈JS使用[ ]来访问对象属性的使用技巧和注意事项,需要的朋友参考一下 对象的属性由两种固定的方法来访问:”.”记法和”[ ]“方括号记法: 使用”.”号记法访问标准的对象属性,使用”[ ]“方括号记法访问由页面定义的对象属性。如下 document.forms["myformname"].elements["myinput"].value
问题内容: 我正在使用以下代码将字符串解析为DOM: 哪里是这样的。 给我。如果我做类似的事情,我会得到一个DOM对象。但是,如果像往常一样尝试访问任何属性,它将为我提供: 其他属性也是如此,例如。另一方面,属性检索很好。 是否有魔术功能可以访问这些属性? 问题答案: 您的当前方法失败,因为未为给定XML文档定义HTML属性。如果提供MIME类型,则该方法应该起作用。 下面的代码为尚不支持它的浏览
属性 属性(Attribute)是一种通用的用于表达元数据的特性,借鉴ECMA-334(C#)的语法来实现ECMA-335中描述的Attributes。属性只能应用于Item(元素、项), 例如 use 声明、模块、函数等。 元素 在Rust中,Item是Crate(库)的一个组成部分。它包括 extern crate声明 use声明 模块(模块是一个Item的容器) 函数 type定义 结构体定
问题内容: 我有一个像这样的对象: 现在,当我尝试访问键“ 0”的值时,例如: …我遇到了错误。(也许这不是正确的方法吗?) 如何访问数字键的值(如上)? 问题答案: 这应该工作: (是的替代语法。) 您会收到此错误,因为在JavaScript中,标识符不能以数字开头。 JavaScript标识符必须以字母,下划线(_)或美元符号($)开头;后续字符也可以是数字(0-9)。因为JavaScript