> 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/124javascript-de-wu-jian-dao-xiang-yu-yuan-xing-ji-cheng/1242liao-jie-yuan-xing.md).

# 1.2.4.2.瞭解原型

* 在JavaScript中, 所有物件包括函數都有原型屬性, 這個屬性會參考到另一個物件稱為proto
  * 當物件中不到某個屬性時, 就會往原型找
  * 物件原型也可以指向另一個原型
  * 當要尋找屬性時:   &#x20;

    ```
    obj.prop1
    obj.prop2
    obj.prop3
    ```
  * 由於obj本身的屬性沒有prop2, prop3, JavaScript engine會向proto, proto的proto尋找屬性跟方法, 這就是原型鍊 (prototype chain):
  * [範圍鍊](https://jenhsuan.gitbooks.io/javascript-node-js/content/chapter1/121zhi-xing-huan-jing-yu-ci-hui-huan-jing/1218fan-wei-lian.html)是尋找取用的變數, 原型鍊則是跟取用的屬性或方法有關
    * 不同的obj可以指向同一個proto&#x20;

      ![](https://3195929128-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M4M0G8GO2MkGtHfarAf%2F-M4M0IHoyFvfGKjf7P-T%2F-M4M0MZVkcE3TbAG34wJ%2F%E6%9C%AA%E5%91%BD343422.jpg?generation=1586302920898095\&alt=media)
  * 範例

```
    var person = {
        firstname: 'Default',
        lastname: 'Default',
        getFullName: function(){
            return this.firstname + ' ' + this.lastname;
        }
    }

    var john = {
        firstname: 'John',
        lastname: 'Doe'
    }

    //don't do this
    john.__proto__ = person;
    //印出'John Doe'
    console.log(john.getFullName());
    //印出'John'
    console.log(john.firstname);
```
