对象是指无序属性的集合,可以想象成一组名值对。
属性类型
定义只有内部采用的特性时,描述了属性的各种特征。为了表示特性是内部值,用两对方括号表示。
两种属性:
数据属性
包含一个数据值的位置,在这个位置可以读取和写入值。数据属性包含4个描述其行为的特性。
[[Configurable]]:表示是否能够通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性。
[[Enumerable]]:表示能够通过for-in循环返回属性。
[[Writable]]:表示能否修改属性的值。
[[Value]]:包含这个属性的数据值。
var person ={};
Object.defineProperty(person,"name",{
writable:false,
value:"Nicholas"
});
alert(person.name);//"Nicholas"
person.name = "Greg";
alert(person.name);//Nicholas
var person = {};
Object.defineProperty(person,"name",{
configurable:false,//configurable设置为false,不能从对象中删除属性,一旦把属性定义为不可配置,那么不能再变回可配置了。
当
value:"Nicholas"
});
alert(person.name);//"Nicholas"
delete person.name;
alert(person.name);//"Nicholas"
调用Object.defineProperty()创建一个新属性,如果不指定,configurable、enumerable、writable特性默认都为false。
访问器属性
访问器属性不包含数据值,包含一对儿getter和setter函数,读取访问器属性时调用getter函数返回有效值;写入访问器属性时,调用setter函数并传入新值,处理数据。
var book = {
_year: 2004,
edition: 1
};
Object.defineProperty(book,"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
定义多个属性
var book = {};
Object.defineProperties(book, {
_year: {
writable: true,
value: 2004
},
edition: {
writable: true,
value: 1
},
year:{
get:function(){
return this._year;
},
set:function(){
if(newValue >2004) {
this._year = newValue;
this.edition + = newValue -2004;
}
}
}
});
以上代码在book对象上定义了两个数据属性和一个访问器属性(year)。
工厂模式
函数封装以特定接口创建对象的细节。
function createPerson(name,age,job){
var o = new Object();
o.name =name;
o.age = age;
o.job = job;
o.sayName = function(){
alert(this.name);
};
return o;
}
var person1 = createPerson("Nicholas",29,"Software Engineer");
var person2 = createPerson("Greg",27,"Doctor");
构造函数模式
除了原声构造函数以外,还有自定义构造函数
function Person(name,age,job){
this.name = name;
this.age=age;
this.job= job;
this.sayName=function(){
alert(this.name);
};
}
var person1= new Person("Nicholas",29,"Software Engineer");
var person2=new Person("Greg",27,"Doctor");
alert(person1.constructor == Person);//true
要创建Person新实例,一共经历了4个步骤:
1,创建一个新对象
2,将构造函数的作用域赋给这个新对象( this指向这个新对象)
3, 执行构造函数中的代码(为这个新对象添加属性)
4,返回新对象