# é¢è¯å®ï¼JavaScriptååï¼ååé¾ ? æä»ä¹ç¹ç¹ï¼  ## ä¸ãåå `JavaScript` 常被æè¿°ä¸ºä¸ç§åºäºååçè¯è¨ââæ¯ä¸ªå¯¹è±¡æ¥æä¸ä¸ªåå对象 å½è¯å¾è®¿é®ä¸ä¸ªå¯¹è±¡ç屿§æ¶ï¼å®ä¸ä» ä» å¨è¯¥å¯¹è±¡ä¸æå¯»ï¼è¿ä¼æå¯»è¯¥å¯¹è±¡çååï¼ä»¥å该对象çååçååï¼ä¾æ¬¡å±å±åä¸æç´¢ï¼ç´å°æ¾å°ä¸ä¸ªååå¹é ç屿§æå°è¾¾ååé¾çæ«å°¾ åç¡®å°è¯´ï¼è¿äºå±æ§åæ¹æ³å®ä¹å¨Objectçæé å¨å½æ°ï¼constructor functionsï¼ä¹ä¸ç`prototype`屿§ä¸ï¼èéå®ä¾å¯¹è±¡æ¬èº« ä¸é¢ä¸¾ä¸ªä¾åï¼ å½æ°å¯ä»¥æå±æ§ã æ¯ä¸ªå½æ°é½æä¸ä¸ªç¹æ®ç屿§å«ä½åå`prototype` ```js function doSomething(){} console.log( doSomething.prototype ); ``` æ§å¶å°è¾åº ```js { constructor: Æ doSomething(), __proto__: { constructor: Æ Object(), hasOwnProperty: Æ hasOwnProperty(), isPrototypeOf: Æ isPrototypeOf(), propertyIsEnumerable: Æ propertyIsEnumerable(), toLocaleString: Æ toLocaleString(), toString: Æ toString(), valueOf: Æ valueOf() } } ``` ä¸é¢è¿ä¸ªå¯¹è±¡ï¼å°±æ¯å¤§å®¶å¸¸è¯´çåå对象 å¯ä»¥çå°ï¼åå对象æä¸ä¸ªèªæå±æ§`constructor`ï¼è¿ä¸ªå±æ§æåè¯¥å½æ°ï¼å¦ä¸å¾å ³ç³»å±ç¤º  ## äºãååé¾ åå对象ä¹å¯è½æ¥æååï¼å¹¶ä»ä¸ç»§æ¿æ¹æ³å屿§ï¼ä¸å±ä¸å±ã以æ¤ç±»æ¨ãè¿ç§å ³ç³»å¸¸è¢«ç§°ä¸ºååé¾ (prototype chain)ï¼å®è§£éäºä¸ºä½ä¸ä¸ªå¯¹è±¡ä¼æ¥æå®ä¹å¨å ¶ä»å¯¹è±¡ä¸ç屿§åæ¹æ³ å¨å¯¹è±¡å®ä¾åå®çæé å¨ä¹é´å»ºç«ä¸ä¸ªé¾æ¥ï¼å®æ¯`__proto__`屿§ï¼æ¯ä»æé 彿°ç`prototype`屿§æ´¾ççï¼ï¼ä¹åéè¿ä¸æº¯ååé¾ï¼å¨æé å¨ä¸æ¾å°è¿äºå±æ§åæ¹æ³ ä¸é¢ä¸¾ä¸ªä¾åï¼ ```js function Person(name) { this.name = name; this.age = 18; this.sayName = function() { console.log(this.name); } } // ç¬¬äºæ¥ å建å®ä¾ var person = new Person('person') ``` æ ¹æ®ä»£ç ï¼æä»¬å¯ä»¥å¾å°ä¸å¾  ä¸é¢åæä¸ä¸ï¼ - æé 彿°`Person`åå¨åå对象`Person.prototype` - æé 彿°çæå®ä¾å¯¹è±¡`person`ï¼`person`ç`__proto__`æåæé 彿°`Person`åå对象 - `Person.prototype.__proto__` æåå 置对象ï¼å 为 `Person.prototype` æ¯ä¸ªå¯¹è±¡ï¼é»è®¤æ¯ç± `Object `彿°ä½ä¸ºç±»å建çï¼è `Object.prototype` 为å 置对象 - `Person.__proto__` æåå ç½®å¿å彿° `anonymous`ï¼å 为 Person æ¯ä¸ªå½æ°å¯¹è±¡ï¼é»è®¤ç± Function ä½ä¸ºç±»å建 - `Function.prototype` å `Function.__proto__ `åæ¶æåå ç½®å¿å彿° `anonymous`ï¼è¿æ ·ååé¾çç»ç¹å°±æ¯ `null` ## ä¸ãæ»ç» ä¸é¢é¦å è¦çå 个æ¦å¿µï¼ `__proto__`ä½ä¸ºä¸å对象ä¹é´çæ¡¥æ¢ï¼ç¨æ¥æåå建å®çæé 彿°çåå对象ç  æ¯ä¸ªå¯¹è±¡ç`__proto__`齿¯æåå®çæé 彿°çåå对象`prototype`ç ```js person1.__proto__ === Person.prototype ``` æé 彿°æ¯ä¸ä¸ªå½æ°å¯¹è±¡ï¼æ¯éè¿ `Function `æé å¨äº§çç ```js Person.__proto__ === Function.prototype ``` åå对象æ¬èº«æ¯ä¸ä¸ªæ®é对象ï¼èæ®é对象çæé 彿°é½æ¯`Object` ```js Person.prototype.__proto__ === Object.prototype ``` ååä¸é¢è¯´äºï¼ææçæé å¨é½æ¯å½æ°å¯¹è±¡ï¼å½æ°å¯¹è±¡é½æ¯ `Function `æé 产çç ```js Object.__proto__ === Function.prototype ``` `Object `çååå¯¹è±¡ä¹æ`__proto__`屿§æå`null`ï¼`null`æ¯ååé¾ç顶端 ```js Object.prototype.__proto__ === null ``` ä¸é¢ä½åºæ»ç»ï¼ - ä¸åå¯¹è±¡é½æ¯ç»§æ¿èª`Object`对象ï¼`Object` å¯¹è±¡ç´æ¥ç»§æ¿æ ¹æºå¯¹è±¡` null` - ä¸åç彿°å¯¹è±¡ï¼å æ¬ `Object` 对象ï¼ï¼é½æ¯ç»§æ¿èª `Function` 对象 - `Object` å¯¹è±¡ç´æ¥ç»§æ¿èª `Function` 对象 - `Function`对象ç`__proto__`伿åèªå·±çååå¯¹è±¡ï¼æç»è¿æ¯ç»§æ¿èª`Object`对象 ## åèæç® - https://juejin.cn/post/6870732239556640775#heading-7 - https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Inheritance_and_the_prototype_chain