1、理解对象html
“万物皆对象”,所谓对象,就是拥有本身的属性和方法的数据。最简单的是经过如下两种方式来定义对象json
<script> //1、开始的模式,经过初实例化一个Object对象,赋给变量person,并在person上添加属性和方法 // var person = new Object(); // person.name = "jiang"; // person.age = 29; // person.job = "software engineer"; // person.sayName = function(){ // console.log(this.name); // } // person.sayName(); //2、 字面量形式建立对象,说明白点就是json形式的数据 var person={ name: 'jiang2', age: 29, job: 'software engineer', sayName: function(){ console.log(this.name); } } person.sayName(); <script>
2、属性类型函数
1. 数据属性含义:包含一个数据值的位置,在这个位置上能够读取和写入值,数据属性有4个描述行为的特征,分别是configurable、enumerable、writable、value。this
configurable:可否经过delete删除属性从而从新定义属性,可否修改属性的特征或者修改成访问其属性,其默认值为truespa
enumerable:表示可否经过for-in循环番薯属性,默认为truecode
writable: 可否修改属性的值。默认为truehtm
value:包含这个属性的数据值,其余属性特性都被设置为true,而value特性被设置为指定的值对象
经过代码来分析属性:blog
//eg,如下例子的name属性的value值就是jiang
// var person ={
// name : 'jiang'
// };
var person = {};
Object.defineProperty(person, 'name', {
writable: false,
value: 'jaing'
});//这说明,当name的writable属性设置为FALSE,该属性没法修改value的值
console.log(person.name);
person.name = 'zhen';
console.log(person.name);
var person2 = {};
Object.defineProperty(person2, 'name', {
configurable: false,
value: 'jiang2'
});
console.log(person2.name);
delete person2.name;
//当configurable为FALSE。delete没法删除name属性
//对name属性调用delete在非严格模式下不会发生问题,可是在严格模式下就会出错,而且一旦设置了FALSE,
//就不能够再变回true,此时在调用Object.defineProperty方法修改writable以外的特征,都会报错
console.log(person2.name);
//调用Object.defineProperty方法时,前三个特征的默认值都是FALSE
2. 访问器属性:ip
configurable:他们包括getter和setter方法,读取访问器属性时,会调用getter方法,负责返回有效值,写入时调用setter方法传入新值,默认值为true
enumerable:表示可否经过for-in循环返回属性,默认为true
get: 读取属性时调用,默认值为undefined
set:写入属性时调用,默认值为undefined
要注意的是:访问器属性不能直接定义,必需要经过Object.defineProperty()来定义。
var book = {
_year: 2014,
edition: 1
}
Object.defineProperty(book, 'year', {
get: function(){
return this._year;
},
set: function(newValue){
if(newValue > 2014){
this._year = newValue;
this.edition += newValue - 2014;
}
}
});
book.year = 2015;
console.log(book.edition);
不必定要同时指定getter和setter,只指定getter意味着属性是不能写,尝试写入属性会被忽略掉,在严格模式下,尝试写入只指定getter函数的属性会抛出错误,相似的,只指定setter函数的属性也不能读,不然在非严格模式下会返回undefined,严格模式下就会跑出错误
建立访问器属性,通常都使用两个非标准的方法,__defineGetter__ 和 __defineSetter__
var book2 = {
_year : 2014,
edition : 1
};
book2.__defineGetter__('year', function(){
return this._year;
});
book2.__defineSetter__('year', function(newValue){
if(newValue > 2014){
this._year = newValue;
this.edition += newValue - 2014;
}
});
book2.year = 2016;
console.log(book2.edition);