数值属性和访问器属性
'use strict'
//方法1:创建一个实例,再给它赋属性和方法
var person =new Object();
person.name="Jiaweiyuan";
person.age=23;
person.job="student";
person.sayName=function(){
console.log("name:"+this.name);
};
// 方法2:对象字面量
var person1={
name:"Zhouquan",
age:23,
job:"student",
sayName:function(){
console.log("name:"+this.name);
}
};
/*6.1.1 属性*/
/*1.数据属性:*/
// [[Configurable]]:表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性或者把属性修改成访问器属性。新定义的对象默认值是true
// [[Enumerable]]:表示能否通过for-in循环返回属性,新定义的对象默认值为true
// [[Writable]]:表示能否修改属性的值,新定义对象默认值为true
// [[Value]]:包含这个属性的数据值,写入/读取数据值的时候,都从这个位置写入/读取
// ES5才出现的,描述了内部特征,不能直接访问,是为了实现javascript的引擎用的,放在两对儿方括号中、
var person2={
name:"Quanshushu"
};
//[[Value]]特性被设置为"Quanshushu",这个值若修改都会被反应在这个位置
/**/
//ES5的Object.defineProperty()方法用来修改属性的默认特性
//Object.defineProperty('属性所在的对象','属性的名字','描述符对象')
Object.defineProperty(person2,"name",{
writable:false,
enumerable:false
});
try{
person2.name="Zhoudeng";
//因为[[Writable]]特性值被修改成false,所以name属性没有被修改
//严格模式下,以上操作会报错
}catch(e){
// console.log(e.message);
}
/**/
// 关于[[Configurable]]特性有以下注意
try{
Object.defineProperty(person1,"name",{configurable:false});
delete person1.name;//result:"Cannot delete..."
}catch(e){
// console.log(e.message);
}
try{
Object.defineProperty(person1,"name",{configurable:false});
// Object.defineProperty(person1,"name",{configurable:true});//error,一旦把属性定义为不可配置的就不能重新定义为可配置的了
Object.defineProperty(person1,"name",{writable:true});//[[Configurable]]特性被设置为false之后,只有[[writable]]特性可以更改
person1.name="asd";
// console.log(person1.name);//result:"asd"
}catch(e){
console.log(e.message);
}
/**/
/*2.访问器属性:*/
//不包含数据值,包含一对儿getter和setter函数(但都不是必须的)
var salary={
_data:2350,//前面的下划线是一种记号,用于表示只能通过对象方法访问的属性
grade:"普通员工",
};
/*支持此方法的浏览器:IE9+,FF4+,SF5+,O12+,Chrome*/
Object.defineProperty(salary,"data",{
get:function(){
return this.data;
}
,
set:function(newValue){
if(newValue>=2350&&newValue<8950){
this._data=newValue;
this.grade="初级工程师";
}
else if(newValue>=8950&&newValue<18950){
this._data=newValue;
this.grade="中级工程师";
}
else if(newValue>=18950&&newValue<28950){
this._data=newValue;
this.grade="高级工程师";
}
else{
this._data=newValue;
this.grade="其他职位";
}
}
});
try{
salary.data=15400;
console.log(JSON.stringify(salary));
}catch(e){
// console.log(e.message)
}
//使用访问器属性的常见方式,即设置一个属性的值会导致其他属性发生变化
//只设置setter函数或者只设置getter函数在strict模式下会导致错误
//旧浏览器访问方法:
// 请注意,该方法是非标准的,不要尝试用它
var book={
_year:2004,
edition:1
}
book.__defineGetter__("year",function(){
return this._year;
});
book.__defineSetter__("year",function(newValue){
if(newValue>2004){
this._year=newValue;
this.edition+=newValue-2004;
}
});
book.year=2005;
// console.log(book.edition);
// 定义多个属性的Object.defineProperties()方法