Get/Set访问器
可以限制一个变量是否可以被访问或是否可以被重写。另外还有一个功能是,我们在访问或重写时可以执行其他语句进行处理
get是得到:一般是要返回的, set是设置:不用返回
var p = {
name:"chen",
work:function() {
console.log("wording...");
},
_age:18,
get age(){
return this._age;
},
set age(val) {
if (val<0 || val> 100) {//如果年龄大于100就抛出错误
throw new Error("invalid value")
}else{
this._age = val;
}
}
};
console.log(p.name);//输出chen
p.age
//"18"
p.age=23
//"23"
p.age=200
//Uncaught Error: invalid value
另一种方法( Object.defineProperty将属性添加到对象,或修改现有属性的特性。):
function Person(){
var age=18;
Object.defineProperty(this,'age',{
get:function(){return age+new Date().getFullYear()},
set:function(value){age=value;}
});
}
var p = new Person();
p.age ; //2035
get/set与原型链
//不包含get/set的原型
function p(){}
p.prototype.z = 9;
var p1 = new p();
p1.z //9 //对象上没有属性,将在原型链上查找
p1.z = 10; //原型上不包含get/set方法时,向原型上的同名属性赋值,会在对象上添加此属性
p1.z //10 //对象上能够找到属性,将不会在原型链上查找
//原型上包含get/set方法
function person(){}
Object.defineProperty(person.prototype,'z',{get:function(){return 1}});
var p = new person();
p.z //1
p.z = 89;
p.z //still 1 原型链上get/set方法,操作此属性的时候,会向上查找原型链。 所以p.z仍旧是1