本文主要是介绍9.3 操作属性,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、定义属性
- 属性包含名和值。属性名可以是包含空字符串在内的任意字符串,属性值可以是任意JavaScript值。但对象中同一级别作用域不能存在两个同名的属性。
- 除了名和值,每个属性还有一些相关的值,称为属性特性
可写(writable attribute):表明是否可以设置该属性的值;
可枚举(enumerable attribute):表明是否可以通过for/in循环返回该属性;
可配置(configurable attribute):表明是否可以删除或者修改该属性; - 可以用冒号定义属性,冒号左侧是属性名,右侧是属性值;属性与属性之间用逗号运算符分隔;
1.定义属性的方式
- 在对象结构体内定义属性
- 使用点运算符在结构体外定义属性
var o={};
o.x=1;
o.y={
x:2,
y:true}//声明变量可以使用var语句,但是在声明对象属性时不能使用var语句
- 使用构造函数定义属性
var o=function(){
this.x=1;
this.y={
x:1,
y:true}}
- 两个静态函数(Object.defineProperty、Object.defineProperties),为指定对象定义属性。
Object.defineProperty
作用:添加新属性到对象,或者修改现有属性的特性
Object.defineProperty(object,propertyname,descriptor)
//参数说明:object,必须参数,指定要添加或者修改属性的对象;
//propertyname,必须参数,属性名称的字符串;
//descriptor,必须参数,定义属性的描述符,针对数据属性(value,writable,enumerable,configurable)或者访问器属性(set,get)
//Object.defineProperty返回值为修改后的对象
//将数据属性添加到对象中var obj={};Object.defineProperty(obj,"newOwnProperty",{value:101,writable:true,enumerable:true,configurable:true});obj.newOwnProperty=102;document.write(obj.newOwnProperty);
//将访问器属性添加到对象中var obj={};Object.defineProperty(obj,"newAccessProperty",{set:function(x){this.newavalue=x*x;},get:function(){return "<h1>"+this.newavalue+"</h1>"},enumerable:true,configurable:true});obj.newAccessProperty=30;document.write(obj.newAccessProperty);
Object.defineProperties
作用:向对象添加多个属性或者修改多个现有属性
Object.defineProperties(object,descriptors);
//参数说明:object,指定的对象;
//descriptors,必须参数,包含一个或者多个描述符对象,每个描述符对象描述一个数据属性或者访问器属性
var obj={};Object.defineProperties(obj,{newDataProperty:{value:101,writable:true,enumerable:true,configurable:true},newAccessProperty:{set:function(x){this.a=x+2;},get:function(){return this.a;},enumerable:true,configurable:true}});obj.newAccessProperty=100;document.write(obj.newAccessProperty);
二、访问属性
1.通过点运算符访问属性。
- 点运算符左侧是对象引用的变量,右侧是属性名(属性名是一个标识符,而不是一个字符串)
- 对象属性与变量的工作方式相同,可以把属性看作对象的私有变量,用来存储数据
2.通过中括号访问属性
- 以数组形式读取对象属性值时,应以字符串形式指定属性名,而不能使用标识符
var o={
x:1,
y:{
x:2,
y:{
x:3,
y:false}
}};
alert(o["y"]["y"]["y"]);
3.使用for/in语句遍历对象属性
var o={x:1,y:2,z:3
};
for(var i in o){alert(o[i])
}//使用for/in遍历对象属性时,应该使用数组操作方式来读取对象属性的值
4.ECMAScript 5 的4个访问对象属性的函数
—Object.getPrototypeOf
- 返回值是object的原型对象
—Object.getOwnPropertyNames
- 返回指定对象私有属性的名称
- 返回值是一个数组
- 包含可枚举和不可枚举的属性和方法的名称
- 私有属性指的是直接对该对象定义的属性,而不是从对象的原型继承的属性
—Object.keys
- 与Object.getOwnPropertyNames类似,但是返回的是可枚举的属性和方法的名称
- 返回值是一个数组
—Object.getOwnPropertyDescriptor
Object.getOwnPropertyDescriptor(object,propertyname)
- 返回值为属性的描述符
var obj={};
obj.newDataProperty="abc";
var desc1=Object.getOwnPropertyDescriptor(obj,"newDataProperty");
desc1.writable=false;
Object.defineProperty(obj,"newDataProperty",desc1);
var desc2=Object.getOwnPropertyDescriptor(obj,"newDataProperty");
for(var prop in desc2){document.write(prop+":"+desc2[prop]);document.write("<br/>")
}
三、赋值属性
- 可以用点运算符和中括号运算符赋值属性
var o={x:1,y:2
}
o.x=3;
o["y"]=4;//数组操作法中括号中是字符串,而不是标识符
alert(o["x"]);
alert(o.y);
四、删除属性
- 使用delete运算符删除属性
- 从对象中彻底清除,而不是设置为undefined
五、对象的方法
- 方法是一种特殊形式的属性,即值为函数的对象属性
- 方法是对象执行特定行为的逻辑块,是与外界实现行为交互的动作
- 使用小括号可以调用对象的方法
- 对象方法内部的this指向调用方法的当前对象
- 对象方法与普通函数用法完全相同,可以在方法中传递参数,可以设计返回值
var o={};
o.x=function(a){return 10*a;
}
var f=o.x(5);
alert(f);
六、配置特性
- Object.preventExtensions(object)
阻止对象添加新属性 - Object.seal(object)
阻止对象添加新属性,阻止修改特性 - Object.freeze(object)
组织对象添加新属性,阻止修改特性,阻止修改属性值
var obj={name:"haha",length:4};
Object.preventExtensions(obj);
obj.newprop=50;
obj.name=50;
document.write(obj.newprop);//返回undefined
document.write(obj.name);//返回50
七、检测特性
- Object.isExtensible(object)
如果对象是可拓展的,即可向对象添加新属性,则为true;否则为false - Object.isSealed(object)
如果无法在对象中修改现有属性的特性,且无法添加新属性,则为true - Object.isFrozen(object)
如果无法修改对象现有属性的特性和值,且无法添加新属性,则为true
var obj={pasta:"spaghetti",length:10};
if(!Object.isFrozen(obj)){obj.pasta=50;
}
Object.freeze(obj);
document.write(obj.pasta);
这篇关于9.3 操作属性的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!