1,创造自定义对象最简单的方式就是创建Object实例,然后为它添加属性与方法。如下:
var person=new Object();
person.name="John";
person.age=20;
person.sayName=function(){
alert(this.name);
}
以上的例子创造了一个名为person的对象,它是Object的实例。它有两个属性和一个方法。早期的Javascript常常采用这个模式创建对象;
上面的例子可以写成这种:
var person={
name:"John",
age:20,
sayName:function(){
alert(this.name);
}
}
2,属性类型:
ECMAScript中有两种属性:数据属性和访问器属性。
(1)要修改属性默认的特征,必须使用ECMAScript 5的Object.defineProperty()方法。这个方法接受三个参数:属性所在的对象,属性的名字和一个描述符对象。其中描述符对象的属性必须是:configurable,enumerable,writable和value.
var person={};
Object.defineProperty(person,"name",{
writable:false,
value:"Miachel"
});
alert(person.name);//"Miachel"
person.name="Greg";
alert(person.name);//"Miachel"
这个例子创建了一个名为name的属性,他的值"Miachel"是只读的,这个属性的值是不可修改的。
类似的规则也适合不可配置的属性。例如,
var person={};
Object.difineProperty(person,"name",{
configurable:false,
value:"Mike"
});
alert(person.name);//Mike
delete person.name;
alert(person.name);//Mike
把configurable设置为false,表示不能从对象删除属性。
(2)访问器属性
访问器属性不包含数据值;她们包含一对儿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
3,创建对象模式
(1)工厂模式--用函数封装以特定接口创建对象的细节。
function createPerson(name,age){
var o=new Object();
o.name=name;
o.age=age;
o.sayName=function(){
alert(this.name);
}
return 0;
}
var person1=createPerson("mike",29);
(2)构造函数
function Person(name,age){
this.name=name;
this.age=age;
this.sayName=function(){
alert(this.name);
}
}
var person1=new Person("Mike",29);
Person()函数中并没有显示的创建对象;且使用构造函数模式创建实例必须使用new关键字;
(3)原型模式
function Person(){
}
Person.prototype.name="mike";
Person.prototype.age=29;
Person.prototype.sayName=function(){
alert(this.name);
}
var person1=new Person();
person1.sayName();
原型是任何对象都固有属性,通过原型方式创建对象的好处是让所有对象实例都共享它所包含的属性与方法。
var person=new Object();
person.name="John";
person.age=20;
person.sayName=function(){
alert(this.name);
}
以上的例子创造了一个名为person的对象,它是Object的实例。它有两个属性和一个方法。早期的Javascript常常采用这个模式创建对象;
上面的例子可以写成这种:
var person={
name:"John",
age:20,
sayName:function(){
alert(this.name);
}
}
2,属性类型:
ECMAScript中有两种属性:数据属性和访问器属性。
(1)要修改属性默认的特征,必须使用ECMAScript 5的Object.defineProperty()方法。这个方法接受三个参数:属性所在的对象,属性的名字和一个描述符对象。其中描述符对象的属性必须是:configurable,enumerable,writable和value.
var person={};
Object.defineProperty(person,"name",{
writable:false,
value:"Miachel"
});
alert(person.name);//"Miachel"
person.name="Greg";
alert(person.name);//"Miachel"
这个例子创建了一个名为name的属性,他的值"Miachel"是只读的,这个属性的值是不可修改的。
类似的规则也适合不可配置的属性。例如,
var person={};
Object.difineProperty(person,"name",{
configurable:false,
value:"Mike"
});
alert(person.name);//Mike
delete person.name;
alert(person.name);//Mike
把configurable设置为false,表示不能从对象删除属性。
(2)访问器属性
访问器属性不包含数据值;她们包含一对儿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
3,创建对象模式
(1)工厂模式--用函数封装以特定接口创建对象的细节。
function createPerson(name,age){
var o=new Object();
o.name=name;
o.age=age;
o.sayName=function(){
alert(this.name);
}
return 0;
}
var person1=createPerson("mike",29);
(2)构造函数
function Person(name,age){
this.name=name;
this.age=age;
this.sayName=function(){
alert(this.name);
}
}
var person1=new Person("Mike",29);
Person()函数中并没有显示的创建对象;且使用构造函数模式创建实例必须使用new关键字;
(3)原型模式
function Person(){
}
Person.prototype.name="mike";
Person.prototype.age=29;
Person.prototype.sayName=function(){
alert(this.name);
}
var person1=new Person();
person1.sayName();
原型是任何对象都固有属性,通过原型方式创建对象的好处是让所有对象实例都共享它所包含的属性与方法。