對象、構造函數和prototype

對象

每一個對象的建立都基於引用類型,好比:javascript

<script>
  var str = new String("beckham");
</script>

咱們能夠建立自定義對象,最簡單的方法就是建立一個Object的實例,好比:java

<script>
  var person = new Person();
  person.name = "Nicholas";
  person.age = 29;
  person.callName = function(){
     alert(this.name);
  }
</script>

上面的例子建立了名爲person的對象,並添加了3個屬性。函數

建立對象和構造函數

1.建立對象有多種方法,上述的一種,屬於Object構造函數。
2.此外,還能夠用字面量對象建立一個函數,以下:this

<script>
  var person = {
    name : "Nicholas",
    age : 29,
    callName : function(){
     alert(this.name);
    }
  };
  alert(person.name);  //"Nicholas"
</script>

3.藍後,是第三種,用工廠模式 建立,以下:spa

<script>
  function person(name,age,callName){
    var o = new Object();
    o.name=name;
    o.age=31;
    o.callName=function()
    {
        alert(this.name);
    };
    return o;
  }
  var person1 = person("Nicholas",29);
</script>

person()函數會根據接收的參數建立一個包含全部信息的對象。可是這種方法因爲沒有解決對象識別的問題(直到對象的類型),並很差~
接下來的一種方法就是下面重點介紹的:自定義構造函數。prototype

自定義構造函數

與上述的構造函數不一樣,用Object、Array之類的構造函數被稱爲原生構造函數。自定義構造函數能夠自定義對象的屬性和方法。構造函數就是初始化一個實例對象。

讓咱們來看一個栗子~指針

<script>
  function Person(name,age,job){
    this.name=name;
    this.age=age;
    this.job=job;
    this.sayName=function()
    {
        alert(this.name);
    };
  }
  var person1 = new Person("Nicholas",29,"engineer");
  alert(person1.name);  //"Nicholas"
</script>

注意~構造函數有一個特色,默認函數首字母大寫。在上面的栗子中,person1就是Person對象的一個實例。person1有一個constructor的屬性,指向Personcode

prototype和原型對象

咱們建立的每個函數都有一個prototype屬性,這個屬性是一個指針,指向一個對象,這個對象包含了由特定類型全部實例共享的屬性和方法。咱們能夠說Person.prototype是person1的原型對象。因此,Person.prototype更像是一個模型和中轉站。讓咱們看下面的栗子:對象

<script>
  function Person(){};
  person.prototype.name = "Nicholas";
  person.prototype.age = 29;
  person.prototype.job = "engineer";
  person.prototype.callName = function(){
    alert(this.name);
  };
  var person1 = new Person();
  person1.callName();  //"Nicholas"
</script>

如上,咱們將callName()方法和全部的屬性添加到了Person的prototype屬性中。Person.prototype是一個第三者,Person和person1其實是沒有連接的,他們二者的聯繫是經過Person.prototype來創建的,而它裏面會保存包括name、age、job等屬性和callName()方法。或許經過下面這個圖更好理解。blog

這裏寫圖片描述

更簡單的原型語法

咱們可能會以爲每次都要寫一遍Person.prototype會比較麻煩,因此咱們能夠用字面量的方式:

<script>
  function Person(){};
  Person.prototype = {
          name : "Nicholas",
          age : 29,
          job : "engineer",
        sayName : function(){
              alert(this.name);
        }
  };
  var person1 = new Person();
</script>

上面的代碼最終的執行結果也是同樣的,只是一點不一樣:constructor再也不指向Person了。

相關文章
相關標籤/搜索