JavaScript對象的深刻理解 (一)

對象,一種數據類型。對象是屬性(變量)方法(函數)結合在一塊兒的數據實體函數

對象的出現,就是爲了解決封裝的問題。能夠將許多屬性與方法封裝在一個對象裏,方便調用,也符合人的思考方式。this

JavaScript中建立對象的基本方法

  1. 建立Object實例,再添加屬性和方法
var person = new Object();
    person.name = "Jonathan";
    person.age = 23;
    person.job = "Developer";
    person.sayName = function () {
    console.log(this.name);
};
  1. 對象字面量方法
    因爲上述寫法繁瑣,故出現了對象字面量方法建立對象。
var person = {
    name: "Jonathan",
    age: 23,
    job: "Developer",
    sayName: function () {
        console.log(this.name);
    }
};

console.log(person.name); //Jonathan
person.sayName(); //Jonathan

這樣一來,就把屬性和方法封裝進了一個對象中,方便調用。code

構造函數模式

若是要建立許多對象,傳統方法存在如下問題對象

  • 對象名太多,容易搞重複
  • 新建一個對象就要所有重寫屬性和方法,過於複雜
  • 沒法發揮JavaScript的面向對象優點(繼承)

因爲JavaScript自己沒有類的概念,所以誕生了構造函數模式來建立對象,該方法利用函數建立對象。因爲函數自己也是對象,所以能夠這麼操做。
構造函數建立對象的方法是:繼承

function Person(name, age, job){
    this.name = name;
    this.age = age;
    this.job = job;
    this.sayName = function(){
                       console.log(this.name);
                   };    
}
        
var person1 = new Person("Nicholas", 29, "Software Engineer");
var person2 = new Person("Greg", 27, "Doctor");

要點:ip

  1. 構造函數命名應以大寫字母開頭(約定俗成的規矩)
  2. 構造函數自己也是函數,只不過是用來建立對象的
  3. 要建立對象的實例,必需要用new操做符,不然跟調用函數無異。
  4. 任何函數,只要經過new操做符來調用,它就能夠做爲構造函數。

至此,一個Person對象的建立就完成了,它有如下優勢:原型

  • 新建對象只用給函數提供參數,簡化了建立。
  • 有了實例的概念,如Person1就是Person的實例。無形之中給對象歸了類。
  • 更好的體現了封裝,建立對象只用給參數,不用關心對象內部細節。

用構造函數模式的方法建立對象並非完美的,它存在如下問題,即:
每一個方法(對象內置函數)都要在實例上從新建立一遍
構造函數也能夠用如下方法定義,方便咱們發現問題io

function Person(name, age, job){
    this.name = name;
    this.age = age;
    this.job = job;
    this.sayName = new Function(console.log(this.name));
    };    
}
        
var person1 = new Person("Nicholas", 29, "Software Engineer");
var person2 = new Person("Greg", 27, "Doctor");

console.log(person1.sayName == person2sayName); //false

在新建對象person1和person2時,分別新建了兩個不一樣的方法person1.sayName()和person2.sayName()。
但這很沒有必要,只須要公用一個sayName()方法就行了。爲了解決上述問題,誕生了原型模式console

相關文章
相關標籤/搜索