您的位置:首页 > 其它

面向对象程序设计——理解对象

2016-02-27 16:11 369 查看
面向对象语言的标志是有类的概念,但是ECMAScript中没有类的概念。
ECMA-262把对象这样定义:无序属性的集合,其属性可以包含基本值、对象或函数。严格的说,对象是一组没有特定顺序的值。对象的每一个属性或方法都有一个名字,而每个名字都映射到一个值。
创建对象:
var person = new Object();
person.name = "Tom";
person.age = 12;
person.sayName = function(){
    alert(""this.name);
};

对象字面量:
var person = {
        name:"Tom",
        age:12,
        sayName:function(){
        alert(this.name);
    }
};

属性类型:数据属性和访问器属性
1.数据属性
说明:数据属性包含一个数据值得位置。在这个位置可以读取和写入值。有4个描述其行为的特性。
a.[[Configurable]]:表示能否通过delete删除属性而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性。默认值为true。
b.[[Enumberable]]:表示能否通过for-in循环返回属性。默认值为true
c.[[Writable]]:表示能否修改属性的值。默认为true
d.[[Value]]:包含这个属性的数据值。读取属性值得时候,从这个位置读;写入属性的时候,把新值保存在这个位置。默认值为un
4000
difined。举例:var person = {name:"Tom"};  这里创建一个name的属性,为它指定的值是:“Tom”,而对这个值得任何修改都将反映在这个位置上。
修改属性默认的特性,必须使用Object.defineProperty()方法。这个方法接收三个参数:属性所在的对象、属性的名字、一个描述符对象。
eg:var person ={};
Object.defineProperty(person,"name",{
        writable:false,
        value:"Tom"
});
alert(person.name);        //Tom
person.name = "Jim";
alert(person.name);        //Tom   已经修改writable属性的默认值,所以再赋值会被忽略,严格模式下会抛出错误。

注意:可以多次调用Object.defineProperty()来修改同一属性,但是当Configurable设置为false时,就会有限制。(writable除外,不会报错,其他三个属性不可以)
2.访问器属性
访问器属性不包含数据值;它有一对getter和setter函数。在读取访问器属性时会调用getter函数,这个函数负责返回有效的值,在写入访问器属性时,会调用setter函数并传入新值,这个函数负责决定如何处理数据。

a.[[Configurable]]:表示能否通过delete删除属性而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性。默认值为true。
b.[[Enumberable]]:表示能否通过for-in循环返回属性。默认值为true
c.[[Get]]:在读取属性时调用的函数。默认值为undefined
d.[[Set]]:在写入属性时调用的函数。默认值是undefined

注意:访问器属性不能直接定义,必须使用Object.defineProperty()来定义。
eg: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

说明:_year前面的下划线是一种常用的记号,用于表示只能通过对象方法访问的属性

定义多个属性——Object.defineProperties()方法
eg:var book = {};
        Object.defineProperties(book,{
        _year:{
        value:2004
},
edition:{
        2
},
year:{
    get: function(){
        return this._year;
},
    set:function(newValue){
    if(newValue > 2004){
        this._year = newValue;
        this.edition += newValue - 2004;
}
}
}
});

读取属性的特性——Object.getOwnPropertyDescriptor()

var book = {};
        Object.defineProperties(book,{
        _year:{
        value:2004
},
edition:{
        2
},
year:{
    get: function(){
        return this._year;
},
    set:function(newValue){
    if(newValue > 2004){
        this._year = newValue;
        this.edition += newValue - 2004;
}
}
}
});

var descriptor = Object.getOwnProtertyDescriptor(book,"_year");
alert(descriptor.value);        //2004
alert(descriptor.configurable);        //false
alert(typeof descriptor.get);        //undifined

var descriptor = Object.getOwnProtertyDescriptor(book,"year");
alert(descriptor.value);        //tundefined
alert(descriptor.enumberable);        //false
alert(typeof descriptor.get);            //"function"
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: