Javascirpt---属性---02

本篇内容主要总结《Javascirpt高级程序设计》中第六章内容

js中两种属性类型

1 数据属性:包含一个数据值的位置

数据属性具有的特性:
[[Configuration]]特性: 是否能通过delete删除属性,默认true
[[Enumerable]]特性: 能否通过 for-in 循环遍历属性,默认值true
[[Writable]]特性: 能否修改特性的值,默认值true
[[Value]]特性: 属性值的地址,读取属性值时从这个地址读,写入时将新值保存到这个地址。默认值undefined

修改属性的特性值,通过 object.defineProperty()方法:

//Object.defineProperty()方法参数:所在对象,属性名称,描述符对象(configuration,enumerable,writebale,value中一个或多个)
var person = {};
   Object.defineProperty(person, "name", {
   writable: false,  //false,用户将不能修改属性值,但配置成true后用户就可以修改
   value: "Nicholas"
});

alert(person.name); //"Nicholas"
person.name = "Greg";
alert(person.name); //"Nicholas"

var person = {};
   Object.defineProperty(person, "name", {
   configurable: false,//配置成false后,就不能将其变为可配置的
   value: "Nicholas"
});
2 访问器属性

访问器属性不包含数据值,包含一对儿 getter 和 setter 函数(这两个函数都不是必需的)。
在读取访问器属性时,会调用 getter 函数,这个函数负责返回有效的值;在写入访问器属性时,会调用
setter 函数并传入新值,有如下 4 个特性。
[[Configurable]],[[Enumerable]]
[[Get]]:读取属性时调用的函数,默认值为 undefined
[[Set]]:写入属性时调用的函数,默认值为 undefined
访问器属性不能直接定义,必须使用 Object.defineProperty()来定义
例:定义year访问器属性

var book = {
	_year: 2004,
	edition: 1
};
Object.defineProperty(book, "year", { //定义year 访问器属性
		get: function(){
		return this._year;
	},
	set: function(newValue){
		if (newValue > 2004) {
		this._year = newValue;
		this.edition += newValue - 2004;
		}
	}
});
book.year = 2005;
alert(book.edition); //2

注:不一定非要同时指定 getter 和 setter只指定 getter 意味着属性不能写,只指定 setter 函数的属性不能读

定义属性,读取属性

通过Object.defineProperties()函数读
Object.getOwnPropertyDescriptor()函数写

var book = {};
Object.defineProperties(book, {
	_year: {
		value: 2004
	},
	edition: {
		value: 1
	},
	year: {
		get: function(){
			return this._year;
		},
		set: function(newValue){
			if (newValue > 2004) {
			this._year = newValue;
			this.edition += newValue - 2004;
			}
		}	
	}
});

var descriptor = Object.getOwnPropertyDescriptor(book, "_year");
alert(descriptor.value); //2004
alert(descriptor.configurable); //false
alert(typeof descriptor.get); //"undefined"
var descriptor = Object.getOwnPropertyDescriptor(book, "year");
alert(descriptor.value); //undefined
alert(descriptor.enumerable); //false
alert(typeof descriptor.get); //"function"
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值