ECMAScript中没有类的概念,所谓对象可以想象成散列表,是一组没有特定顺序的值,即一组名值对,其中值可以是数据或函数
1.可变的键控集合,适用于汇集和管理数据,对象可以包含其他对象(即一组数据的集合)
2.对象是无类型的包含一种原型链的特性,允许对象继承另一个对象的属性
3.创建一个新对象的方式:
a.var person = new Object();
person.name = "nihao"
person.age = 18;
person.sayName = function(){
alert(this.name);
}
...
b. var person = {
name:"nihao",
age:18,
sayName:function(){
alert(this.name);
}
...
} 4.b方法即为对象字面量语法,可以方便的按照规定的规格创建新对象的表达法 属性名可以是标识符或者字符串,这些名字被当做字面量名而不是变量名来对待, 所以对象的属性名在编译的时候才能知道 对象字面量运行出现在任何允许表达式出现的地方
5.ECMAScript中有两种属性:数据属性和访问器属性
数据属性
a.数据属性包含四个特性
[[Configable]]:表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性,默认为true
[[Enumerable]]:表示能否通过for-in循环返回属性
[[Writeable]]:表示能否修改属性的值
[[Value]]:包含这个属性的数据值
b.要修改以上默认特性的值,必须使用ECMAScript的Object.defineProperty()方法
这个方法接收三个参数:属性所在的对象,属性的名字,和一个描述对象(表明要修改哪些特性)
例如:
var person = new Object();
Object.defineProperty(person,"name",{
writeable:false,
value:"csy"
})
此时如果我们还希望去修改name的值,那么在非严格模式下赋值操作会被忽略,在严格模式下则会报错
注意:一旦修改了configable特性变为false,则不可再改回可配置的了,此时再修改除了writeable以外的特性都会导致错误
访问器属性
访问器属性不包含数据值,它们包含一对getter和setter函数
在读取访问器属性时会调用getter,负责返回有效的值,在写入访问器属性时,会调用setter函数并传入值
访问器属性不能直接定义,必须通过Object.defineProperty()来定义
var book = {
_year:2004,
edition:1
}
带有下划线的属性代表只能通过对象方法访问。
Object.defineProperty(book,"year",{
get:function(){
return this._year;
},
set:fuhnction(newyear){
if(newyear>2004){
this._year = newyear;
this.editin += newyear-2004;
}
}
});
只指定getter意味着属性是不能写,尝试写入属性会被忽略,同样只指定setter也不能读
否则在非严格模式下会返回undefined,严格模式下会抛出错误
6.同时定义多个属性Object.defineProperties()
7.创建对象:使用同一个接口创建很多个对象会产生大量的重复代码
8.工厂模式:抽象了创建具体对象的过程,用函数来封装以特定的接口创建对象的细节
function createPerson(name,age,job){
var o = new Object;
o.name = name;
o.age = age;
o.job = job;
return o;
}
缺点:没有解决对象识别的问题,即创建了一个怎样的对象类型
9.构造函数模式:
function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.sayName = function(){
alert(this.name);
}
}
特点:1.没有显式的创建对象;2.直接的将属性与方法赋给了this对象;3.没有写return语句
创建自定义的构造函数意味着将来可以将它的实例标识为一种特定的类型
|