日期:2014-05-16  浏览次数:20549 次

JS_理解对象

1、数据属性

  • [[Configurable]]:能否通过delete删除属性从而重新定义属性。默认为true.
  • [[Enumerable]]能否通过for-in循环删除属性。默认为true.
  • [[Writable]]能否修改属性。默认为true.
  • [[Value]]:包含属性的数据值。默认为undefined。
要修改属性的默认特性,必须要使用ECMAScrpit的Object.defineProperty()方法,这个方法接受3个参数,属性所在对象,属性名,描述符对象。
Object.defineProperty()对一个对象的一个方法只能调用一次,否则报cannot redfine property :xxx;
var person = {}
Object.defineProperty(person, "name", {
	writable : false,
	configurable : false,
	value:"zhangsan"
});
person.name = "lisi";
Object.defineProperty(person, "name", {
	writable : true
});
document.write("pserson.name: " + person.name);
?2、访问器属性
  • [[Configurable]]:能否通过delete删除属性从而重新定义属性。默认为true.
  • [[Enumerable]]能否通过for-in循环删除属性。默认为true.
  • [[Get]]在读取属性时调用的函数。默认为undefined.
  • [[Set]]:在写入属性时调用的函数。默认为undefined。
访问器属性不能直接定义,必须使用Object.defineProperty()来定义。
var book = {_year:2003,edition:5};
Object.defineProperty(book,"year",{
	get:function(){
		return this._year;
	},
	set:function(newValue){
		this._year = newValue;
		this.edition +=newValue-2003;
	}
});
book.year = 2014;
document.write("book.edition: " + book.edition);
?3、读取属性的特性使用Object.getOwnPropertyDescriptor方法。eg.
var book = {
	_year : 2003,
	edition : 5
};
Object.defineProperties(book, {
	_year : {
		writable : false,
		configurable : false
	},
	year : {
		get : function() {
			return this._year;
		},
		set : function(newValue) {
			this._year = newValue;
			this.edition += newValue - 2003;
		}
	}
});
book.year = 2014;
var descriptor = Object.getOwnPropertyDescriptor(book, "_year");
console.log("descriptor: ",descriptor);
document.write("book.edition: " + book.edition);
?

?