> For the complete documentation index, see [llms.txt](https://jen-hsuan-hsieh.gitbook.io/javascript-node-js/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://jen-hsuan-hsieh.gitbook.io/javascript-node-js/chapter1/12javascript-quan-gong-lve-ff1a-ke-fu-js-de-qi-guai-bu-fen/125han-shu-jian-gou-zi-3001-300c-new-300d-yu-javascript-de-li-shi/1252han-shu-jian-gou-zi-yu-300c-prototype.md).

# 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)
      ```
