# 1.2.5.2.函數建構子與「.prototype」

* JavaScript的[函數就是物件](https://jenhsuan.gitbooks.io/javascript-node-js/content/chapter1/1235han-shu-jiu-shi-wu-jian.html)
* JavaScript的函數除了CODE property, name property之外, 還會有原型屬性(prototype property)
* 原型屬性(prototype property)
  * **一旦使用new運算子時, 將函數當成函數運算子時才會用到**
  * 任何使用new所建立的物件, 我可以新增屬性到這些物件上, 因為已經有原型物件
  *   並不是在設定或取用函數的原型, 而是物件的原型

      ```
      //建立物件
      function Person() {
        this.firstname = 'John';
        this.lastname = 'Doe';
        }
      //建立空物件
      //呼叫person, 並把this指到person上
      var john = new Person();
      //印出Person {firstname: "John", lastname: "Doe"}
      console.log(john)
      Person.prototype.getFullName = function() {
        return this.firstname + ' ' + this.lastname
      }
      ```
  * 函數的原型屬性(prototype property), 其實就是用函數建構子建立的物件, 其原型鍊所指向的東西
  * 可以用原型屬性(prototype property)為函數原型增加一個新方法
    * 當要取用這些方法時, [原型練](https://jenhsuan.gitbooks.io/javascript-node-js/content/chapter1/124javascript-de-wu-jian-dao-xiang-yu-yuan-xing-ji-cheng/1242liao-jie-yuan-xing.html)會先看這些物件存不存在
  * 真正好的JavaScript code, 屬性會在建構子中被設定, 因為他們常常是不同的值
    *   但是方法用prototype設定的好處之一是: 不需要新增函數給每個物件, 會佔太多記憶體, 每個物件都會拷貝一份

        ```
        //為函數原型增加一個新方法
        //原型中的this會指向物件
        Person.prototype.getFullName = function() {
          return this.firstname + ' ' + this.lastname
        }
        console.log(John.getFullName)
        ```
