讀《javaScript高級程序設計-第6章》之理解對象

ECMA-262把對象定義爲:無序屬性的集合,其屬性能夠包含基本值、對象或函數。因此,咱們能夠理解對象就是名值對的集合,名就是對象的每一個屬性的名字,而每一個名字都映射到一個值。java

建立對象

建立對象有兩種方式:
方式一segmentfault

var person=new Object();
person.name=「Jone」;
person.age=20;
person.job=「Software Engineer」;

person.sayName=function(){
    alert(this.name);
};

方式二函數

var person={
    name:」Jone」,
    age:20,
    job:「Software Engineer」,
    
    sayName:function(){
        alert(this.name);
    }
};

這兩種方式建立的對象都是同樣的。也能夠靈活的混合使用,但要記住var person=new Object()this

var person={
    name:」Jone」,
    age:20,
    job:「Software Engineer」,
    
    sayName:function(){
        alert(this.name);
    }
}

都是在爲person賦值,不可重複賦值,若是重複使用就至關於前面的值放棄,使用後來從新賦的值。或者說都是在給person指向了一個新的地址,地址裏存着新的對象。person肯定是一個引用類型了,就能夠在任意的地方用點來爲它添加屬性和訪問屬性,例如:person.sex=「女」。person用點訪問時不會再爲person更改指向地址,更改的是地址裏存着的對象。設計

對象屬性的特性

對象的屬性能夠分爲兩種屬性:數據屬性,訪問器屬性。兩種類型的屬性有各自的特性。code

  • 數據屬性:
[[configurable]]:表示可否經過delete刪除屬性,可否修改屬性的特性,或者可否把屬性修改成訪問器屬性。
[[enumerable]]:表示可否經過for-in循環返回屬性。
[[writable]]:表示可否修改屬性的值。
[[value]]:包含這個屬性的數據值。讀取屬性值的時候,從這個位置讀取;寫入屬性值的時候,把新值保存在這個位置。這個特性的默認值是undefined。
像上面的例子那樣直接在對象上定義的屬性,它們的configurable、enumerable、writable這些特性默認值爲true。
  • 訪問器屬性:
[[configurable]]:表示可否經過delete刪除屬性,可否修改屬性的特性,或者可否把屬性修改成訪問器屬性。
[[enumerable]]:表示可否經過for-in循環返回屬性。
[[get]]:在讀取屬性時調用的函數。默認值是undefined
[[set]]:在寫入屬性時調用的函數。默認值是undefined
像上面的例子那樣直接在對象上定義的屬性,它們的configurable、enumerable這些特性默認值爲true。

訪問器屬性的使用方式即:設置一個屬性的值會致使其餘屬性發生變化。
訪問器屬性的getset特性不能直接定義,而是使用Object.defineProperty()來定義,屬性的getset特性和writablevalue特性不能同時存在。對象

  • 特性的訪問方法:
  1. Object.defineProperty()

例如:繼承

var book={};
Object.defineProperty(book,」year」,{
    configurable:true,
    value:2004
});
Object.defineProperty(person,」_year」,{
    configurable:true,
    get:function(){
        return this.year;
    },
    set:function(newValue){
        if(newValue>2004){
            this.year=newValue;
        }
    }
});

建立一個新屬性,或修改一個屬性的特性。建立一個新屬性時,若是不指定,configurableenumerablewritable默認值都爲falseconfigurable一旦被設置爲false,就不能再把它變回true了,此時,再調用Object.defineProperty()修改除writable以外的特性都會報錯。ip

  1. Object.defineProperties()

能夠一次性定義多個屬性。get

var book={};
Object.defineProperties(book,{
    year:{
        configurable:true,
        value:2004
    },
    _year:{
        configurable:true,
        get:function(){
            return this.year;
        },
        set:function(newValue){
            if(newValue>2004){
                this.year=newValue;
            }
        }
    }
});
  1. Object.getOwnPropertyDescriptor()

用來讀取屬性的特性。接受兩個參數:屬性所在的對象和要讀取其特性的屬性名,返回的時其特性的對象
例如:

var descriptor=Object.getOwnPropertyDescriptor(book,」year」);
            alert(descriptor.value);//2004
            alert(descriptor.configurable);//true

讀《javaScript高級程序設計》這本書的第6章面向對象的程序設計,我作了3篇筆記。這是第一篇,後面還有兩篇,分別是封裝類繼承
之前一直認爲真正理解了一個問題,你就能把它講清楚,講清楚了再把它寫清楚就容易了,如今發現要寫清楚真的太難了,要斟酌每句話都不是廢話,沒有歧義,儘可能用少的字句等等。廢話了很久也不知道寫清楚了嗎。
若是哪裏有問題歡迎指出。

相關文章
相關標籤/搜索