JavaScript使用对象笔记3:操作属性(JavaScript)

本文详细介绍了JavaScript中的属性概念,包括属性的定义、访问、删除,以及ECMAScript5引入的属性特性如可写、可枚举和可配置等。同时,文章还探讨了如何使用Object.defineProperty和Object.defineProperties函数来定义和修改属性。

属性包括名和值。属性名可以是包含空字符串在内的任意字符串,但对象中不能存在两个同名的属性。值可以是任意JavaScript值。

除了名和值之外,每个属性还有一些相关的值,称为属性特性:

  • 可写(writable attribute):表明是否可以设置该属性的值。
  • 可枚举(enumerate attribute):表明是否可以通过for/in循环返回该属性。
  • 可配置(configurable attribute):表明是否可以删除或修改该属性。

定义属性

使用冒号可以为对象定义属性,冒号左侧是属性名,右侧是属性值。属性与属性之间通过逗号运算符进行分隔。

定义一个3级嵌套的对象结构。虽然3级嵌套对象都包含相同的属性名,但是由于它们分属性不同的作用域,因此不会发生冲突。

var o={
	x:1,
	y:{
		x:3,
		y:true
	}
}

除了在对象结构体内定义属性外,还可以通过点运算符在结构体外定义属性。

var o={};
o.x=1;
o.y={
	x:2,
	y:false
}

通过构造函数定义属性。

var o=function(){
	this.x=1;
	this.y={
		x:1,
		y:true
	}
}

ECMAScript5增加了两个静态函数。

Object.defineProperty

Object.defineProperty可以将属性添加到对象,或者修改现有属性的特性。使用Object.defineProperty可以完成以下操作:

  • 将新属性添加到对象,在对象没有指定的属性名称时执行此操作。
  • 修改现有属性的特性,在对象已有指定的属性名称时执行此操作。

具体用法如下:

Object.defineProperty(object,propertyname,descriptor)

参数说明:

  • object,必需参数,指定要添加或修改属性的对象,可以是JavaScript本地对象(用户定义对象或内置对象)或DOM对象。
  • propertyname,必需参数,表示一个包含属性名称的字符串。
  • descriptior,必需参数,定义属性的描述符,它可以针对数据属性或访问器属性。在描述符对象中提供了属性定义,它描述了数据属性或访问器属性的特性。描述符对象是Object.defineProperty函数的参数。

Object.defineProperty返回值为已修改的对象。

var obj={};
Object.defineProperty(obj,"newDataProperty",{
	value:10,
	writable:true,
	enumerable:true,
	configurable:true
});
obj.newDataProperty=102;
document.write(obj.newDataProperty);	//102

var obj={};
Object.defineProperty(obj,"newDataProperty",{
	set:function(x){
		this.newaccpropvalue=x*x;
	},
	get:function(){
		return this.newaccpropvalue;
	},
	enumerable:true,
	configurable:true
});
obj.newDataProperty=30;
document.write(obj.newDataProperty);	//900

Object.defineProperties

如果要将多个属性添加到对象或要修改多个现有属性,可以使用Object.defineProperties函数。具体用法:

Object. defineProperties (object ,descriptor)

参数说明:

  • object,必需参数,对其添加或修改属性的对象,可以是本地对象或DOM对象。
  • descriptor,必需参数,包含一个或多个描述符对象。每个描述符对象描述一个数据属性或访问器属性。
var obj={};
Object.defineProperties(obj,{
	newDataProperty:{
		value:101,
		writable:true,
		enumerable:true,
		configurable:true
	},
	newAccessorProperty:{
		set:function(x){
			this.newaccpropvalue=x;
		},
		get:function(){
			return this.newaccpropvalue;
		},
		enumerable:true,
		configurable:true
	}
});
obj.newAccessorProperty=10;
document.write(obj.newAccessorProperty);	//10

访问属性

通过点运算符可以访问对象属性,点运算符左侧是对象引用的变量,右侧是属性名,属性名必须是一个标识符,而不是一个字符串。

var o={
	x:1,
	y:{
		x:3,
		y:true
	}
	
}
alert(o.y.y);   //true

赋值属性

与读取对象属性值操作相同,设置对象属性的值也可以使用点运算符和数组操作方法来实现。

var o={
	x:1,
	y:2
};
o.x=33;
o["y"]=12;
alert(o["x"]);	//33
alert(o.y);	//12

删除属性

使用delete运算符可以删除对象属性,这与变量操作相同。

var o={x:1};
delete o.x;
alert(o.x);	//undefined

使用方法

在JavaScript中,方法(Method)就是对象属性的一种特殊形式,即值为函数的属性。从功能角度分析,方法是对象执行特定行为的逻辑块,是与外界实现行为交互的动作。

定义对象方法

var o={
	x:function(){
		alert("hello");
	}
}
var o={};
o.x=function(){
	alert("hello");
};

调用对象方法:

o.x();

配置特性

ECMAScript5新增3个函数用来设置对象属性的特性:Object.seal、Object.Frozen和Object.preventExtensions。这3个函数都可以用来保护指定属性,防止修改现有属性的特性,或者阻止添加新属性。具体用法如下:

Object.seal(object)
Object.Frozen(object)
Object.preventExtensions(object)

  • Object.seal(object):能够阻止修改现有属性的特性,并阻止添加新属性。但是对属性值不进行保护。
  • Object.Frozen(object):能够阻止修改现有属性的特性和值,并阻止添加新属性。
  • Object.preventExtensions(object):能够阻止向对象添加新属性。但是对属性值和特性修改不进行保护。
var obj={
	pasta:"spaghetti",
	length:10
};
Object.preventExtensions(obj);
obj.newProp=50;
obj.pasta=50;
document.write(obj.newProp);	//	undefined
document.write(obj.pasta);	//50
var obj={
	pasta:"spaghetti",
	length:10
};
Object.seal(obj);
obj.newProp=50;
obj.pasta=50;
document.write(obj.newProp);	//	undefined
document.write(obj.pasta);	//50
var obj={
	pasta:"spaghetti",
	length:10
};
Object.freeze(obj);
obj.newProp=50;
obj.pasta=50;
document.write(obj.newProp);	//	undefined
document.write(obj.pasta);	//spaghetti

检测特性

为了确定属性的特性,ECMAScript5新增了3个函数用来进行检测,即Object.isSealed、Object.isFrozen和Object.isExtensible。

其用法介绍如下:

  • Object.isSealed(object):如果无法在对象中修改现有属性的特性,且无法向对象添加新属性,则返回true。
  • Object.isFrozen(object):如果无法在对象中修改现有属性的特性和值,且无法向对象添加新属性,则返回true。
  • Object.isExtensible(object):如果对象是可扩展的(这表示可向对象添加新属性),则为true;否则为false。
var obj={
	pasta:"spaghetti",
	length:10
};
if(!Object.isFrozen(obj)){
	obj.pasta=50;
}
Object.freeze(obj);
document.write(obj.pasta);	//50

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值