{"id":659,"date":"2024-06-19T16:05:47","date_gmt":"2024-06-19T08:05:47","guid":{"rendered":"https:\/\/levin.ink\/?p=659"},"modified":"2024-06-19T16:05:47","modified_gmt":"2024-06-19T08:05:47","slug":"js-3-8-%e7%b1%bb","status":"publish","type":"post","link":"https:\/\/levin.ink\/?p=659","title":{"rendered":"JS &#8211; 3-8 \u7c7b"},"content":{"rendered":"<h1>Class \u57fa\u672c\u8bed\u6cd5<\/h1>\n<p>\u5728\u65e5\u5e38\u5f00\u53d1\u4e2d\uff0c\u6211\u4eec\u7ecf\u5e38\u9700\u8981\u521b\u5efa\u8bb8\u591a\u76f8\u540c\u7c7b\u578b\u7684\u5bf9\u8c61\uff0c\u4f8b\u5982\u7528\u6237\uff08users\uff09\u3001\u5546\u54c1\uff08goods\uff09\u6216\u8005\u4efb\u4f55\u5176\u4ed6\u4e1c\u897f\u3002<br \/>\n\u6b63\u5982\u6211\u4eec\u5728\u00a0<a href=\"https:\/\/zh.javascript.info\/constructor-new\">\u6784\u9020\u5668\u548c\u64cd\u4f5c\u7b26 &quot;new&quot;<\/a>\u00a0\u4e00\u7ae0\u4e2d\u5df2\u7ecf\u5b66\u5230\u7684\uff0c<code>new function<\/code>\u00a0\u53ef\u4ee5\u5e2e\u52a9\u6211\u4eec\u5b9e\u73b0\u8fd9\u79cd\u9700\u6c42\u3002<br \/>\n\u4f46\u5728\u73b0\u4ee3 JavaScript \u4e2d\uff0c\u8fd8\u6709\u4e00\u4e2a\u66f4\u9ad8\u7ea7\u7684\u201c\u7c7b\uff08class\uff09\u201d\u6784\u9020\u65b9\u5f0f\uff0c\u5b83\u5f15\u5165\u8bb8\u591a\u975e\u5e38\u68d2\u7684\u65b0\u529f\u80fd\uff0c\u8fd9\u4e9b\u529f\u80fd\u5bf9\u4e8e\u9762\u5411\u5bf9\u8c61\u7f16\u7a0b\u5f88\u6709\u7528\u3002<\/p>\n<h2>\u201cclass\u201d\u8bed\u6cd5<\/h2>\n<pre><code class=\"language-js\">class MyClass {\n  \/\/ class \u65b9\u6cd5\n  constructor() { ... }\n  method1() { ... }\n  method2() { ... }\n  method3() { ... }\n  ...\n}\n<\/code><\/pre>\n<p>\u7136\u540e\u4f7f\u7528\u00a0<code>new MyClass()<\/code>\u00a0\u6765\u521b\u5efa\u5177\u6709\u4e0a\u8ff0\u5217\u51fa\u7684\u6240\u6709\u65b9\u6cd5\u7684\u65b0\u5bf9\u8c61\u3002<br \/>\n<code>new<\/code>\u00a0\u4f1a\u81ea\u52a8\u8c03\u7528\u00a0<code>constructor()<\/code>\u00a0\u65b9\u6cd5\uff0c\u56e0\u6b64\u6211\u4eec\u53ef\u4ee5\u5728\u00a0<code>constructor()<\/code>\u00a0\u4e2d\u521d\u59cb\u5316\u5bf9\u8c61\u3002<\/p>\n<pre><code class=\"language-js\">class User {\n\n  constructor(name) {\n    this.name = name;\n  }\n\n  sayHi() {\n    alert(this.name);\n  }\n\n}\n\n\/\/ \u7528\u6cd5\uff1a\nlet user = new User(&quot;John&quot;);\nuser.sayHi();\n<\/code><\/pre>\n<p>\u5f53 new User(&quot;John&quot;) \u88ab\u8c03\u7528\uff1a<br \/>\n\u4e00\u4e2a\u65b0\u5bf9\u8c61\u88ab\u521b\u5efa\u3002<br \/>\nconstructor \u4f7f\u7528\u7ed9\u5b9a\u7684\u53c2\u6570\u8fd0\u884c\uff0c\u5e76\u5c06\u5176\u8d4b\u503c\u7ed9 this.name\u3002<br \/>\n\u2026\u2026\u7136\u540e\u6211\u4eec\u5c31\u53ef\u4ee5\u8c03\u7528\u5bf9\u8c61\u65b9\u6cd5\u4e86\uff0c\u4f8b\u5982 user.sayHi\u3002<\/p>\n<blockquote>\n<p>\u7c7b\u7684\u65b9\u6cd5\u4e4b\u95f4\u6ca1\u6709\u9017\u53f7<br \/>\n\u5bf9\u4e8e\u65b0\u624b\u5f00\u53d1\u4eba\u5458\u6765\u8bf4\uff0c\u5e38\u89c1\u7684\u9677\u9631\u662f\u5728\u7c7b\u7684\u65b9\u6cd5\u4e4b\u95f4\u653e\u7f6e\u9017\u53f7\uff0c\u8fd9\u4f1a\u5bfc\u81f4\u8bed\u6cd5\u9519\u8bef\u3002<br \/>\n\u4e0d\u8981\u628a\u8fd9\u91cc\u7684\u7b26\u53f7\u4e0e\u5bf9\u8c61\u5b57\u9762\u91cf\u76f8\u6df7\u6dc6\u3002\u5728\u7c7b\u4e2d\uff0c\u4e0d\u9700\u8981\u9017\u53f7\u3002<\/p>\n<\/blockquote>\n<h2>\u4ec0\u4e48\u662f class\uff1f<\/h2>\n<p>\u8fd9\u4e0d\u662f\u4e00\u4e2a\u5168\u65b0\u7684\u8bed\u8a00\u7ea7\u5b9e\u4f53\u3002\u5728 JavaScript \u4e2d\uff0c\u7c7b\u662f\u4e00\u79cd\u51fd\u6570\u3002<\/p>\n<pre><code class=\"language-js\">class User {\n  constructor(name) { this.name = name; }\n  sayHi() { alert(this.name); }\n}\n\n\/\/ \u4f50\u8bc1\uff1aUser \u662f\u4e00\u4e2a\u51fd\u6570\nalert(typeof User); \/\/ function\n<\/code><\/pre>\n<p><code>class User {...}<\/code>\u00a0\u6784\u9020\u5b9e\u9645\u4e0a\u505a\u4e86\u5982\u4e0b\u7684\u4e8b\u513f\uff1a<\/p>\n<ol>\n<li>\u521b\u5efa\u4e00\u4e2a\u540d\u4e3a\u00a0<code>User<\/code>\u00a0\u7684\u51fd\u6570\uff0c\u8be5\u51fd\u6570\u6210\u4e3a\u7c7b\u58f0\u660e\u7684\u7ed3\u679c\u3002\u8be5\u51fd\u6570\u7684\u4ee3\u7801\u6765\u81ea\u4e8e\u00a0<code>constructor<\/code>\u00a0\u65b9\u6cd5\uff08\u5982\u679c\u6211\u4eec\u4e0d\u7f16\u5199\u8fd9\u79cd\u65b9\u6cd5\uff0c\u90a3\u4e48\u5b83\u5c31\u88ab\u5047\u5b9a\u4e3a\u7a7a\uff09\u3002<\/li>\n<li>\u5b58\u50a8\u7c7b\u4e2d\u7684\u65b9\u6cd5\uff0c\u4f8b\u5982\u00a0<code>User.prototype<\/code>\u00a0\u4e2d\u7684\u00a0<code>sayHi<\/code>\u3002<br \/>\n\u5f53\u00a0<code>new User<\/code>\u00a0\u5bf9\u8c61\u88ab\u521b\u5efa\u540e\uff0c\u5f53\u6211\u4eec\u8c03\u7528\u5176\u65b9\u6cd5\u65f6\uff0c\u5b83\u4f1a\u4ece\u539f\u578b\u4e2d\u83b7\u53d6\u5bf9\u5e94\u7684\u65b9\u6cd5\uff0c\u6b63\u5982\u6211\u4eec\u5728\u00a0<a href=\"https:\/\/zh.javascript.info\/function-prototype\">F.prototype<\/a>\u00a0\u4e00\u7ae0\u4e2d\u6240\u8bb2\u7684\u90a3\u6837\u3002\u56e0\u6b64\uff0c\u5bf9\u8c61\u00a0<code>new User<\/code>\u00a0\u53ef\u4ee5\u8bbf\u95ee\u7c7b\u4e2d\u7684\u65b9\u6cd5\u3002<br \/>\n\u6211\u4eec\u53ef\u4ee5\u5c06\u00a0<code>class User<\/code>\u00a0\u58f0\u660e\u7684\u7ed3\u679c\u89e3\u91ca\u4e3a<br \/>\n<img decoding=\"async\" src=\"https:\/\/levin.ink\/wp-content\/uploads\/2024\/06\/Pasted-image-20240604180203.png\" alt=\"Pasted image 20240604180203.png\"><\/li>\n<\/ol>\n<pre><code class=\"language-js\">class User {\n  constructor(name) { this.name = name; }\n  sayHi() { alert(this.name); }\n}\n\n\/\/ class \u662f\u4e00\u4e2a\u51fd\u6570\nalert(typeof User); \/\/ function\n\n\/\/ ...\u6216\u8005\uff0c\u66f4\u786e\u5207\u5730\u8bf4\uff0c\u662f constructor \u65b9\u6cd5\nalert(User === User.prototype.constructor); \/\/ true\n\n\/\/ \u65b9\u6cd5\u5728 User.prototype \u4e2d\uff0c\u4f8b\u5982\uff1a\nalert(User.prototype.sayHi); \/\/ sayHi \u65b9\u6cd5\u7684\u4ee3\u7801\n\n\/\/ \u5728\u539f\u578b\u4e2d\u5b9e\u9645\u4e0a\u6709\u4e24\u4e2a\u65b9\u6cd5\nalert(Object.getOwnPropertyNames(User.prototype)); \/\/ constructor, sayHi\n<\/code><\/pre>\n<h2>\u4e0d\u4ec5\u4ec5\u662f\u8bed\u6cd5\u7cd6<\/h2>\n<p>\u4eba\u4eec\u5e38\u8bf4\u00a0<code>class<\/code>\u00a0\u662f\u4e00\u4e2a\u8bed\u6cd5\u7cd6\uff08\u65e8\u5728\u4f7f\u5185\u5bb9\u66f4\u6613\u9605\u8bfb\uff0c\u4f46\u4e0d\u5f15\u5165\u4efb\u4f55\u65b0\u5185\u5bb9\u7684\u8bed\u6cd5\uff09\uff0c\u56e0\u4e3a\u6211\u4eec\u5b9e\u9645\u4e0a\u53ef\u4ee5\u5728\u4e0d\u4f7f\u7528\u00a0<code>class<\/code>\u00a0\u7684\u60c5\u51b5\u4e0b\u58f0\u660e\u76f8\u540c\u7684\u5185\u5bb9<\/p>\n<pre><code class=\"language-js\">\/\/ \u7528\u7eaf\u51fd\u6570\u91cd\u5199 class User\n\n\/\/ 1. \u521b\u5efa\u6784\u9020\u5668\u51fd\u6570\nfunction User(name) {\n  this.name = name;\n}\n\/\/ \u51fd\u6570\u7684\u539f\u578b\uff08prototype\uff09\u9ed8\u8ba4\u5177\u6709 &quot;constructor&quot; \u5c5e\u6027\uff0c\n\/\/ \u6240\u4ee5\uff0c\u6211\u4eec\u4e0d\u9700\u8981\u521b\u5efa\u5b83\n\n\/\/ 2. \u5c06\u65b9\u6cd5\u6dfb\u52a0\u5230\u539f\u578b\nUser.prototype.sayHi = function() {\n  alert(this.name);\n};\n\n\/\/ \u7528\u6cd5\uff1a\nlet user = new User(&quot;John&quot;);\nuser.sayHi();\n<\/code><\/pre>\n<p>\u8fd9\u4e2a\u5b9a\u4e49\u7684\u7ed3\u679c\u4e0e\u4f7f\u7528\u7c7b\u5f97\u5230\u7684\u7ed3\u679c\u57fa\u672c\u76f8\u540c\u3002\u56e0\u6b64\uff0c\u8fd9\u786e\u5b9e\u662f\u5c06\u00a0<code>class<\/code>\u00a0\u89c6\u4e3a\u4e00\u79cd\u5b9a\u4e49\u6784\u9020\u5668\u53ca\u5176\u539f\u578b\u65b9\u6cd5\u7684\u8bed\u6cd5\u7cd6\u7684\u7406\u7531\u3002<br \/>\n\u5c3d\u7ba1\uff0c\u5b83\u4eec\u4e4b\u95f4\u5b58\u5728\u7740\u91cd\u5927\u5dee\u5f02\uff1a<\/p>\n<ol>\n<li>\u9996\u5148\uff0c\u901a\u8fc7\u00a0<code>class<\/code>\u00a0\u521b\u5efa\u7684\u51fd\u6570\u5177\u6709\u7279\u6b8a\u7684\u5185\u90e8\u5c5e\u6027\u6807\u8bb0\u00a0<code>[[IsClassConstructor]]: true<\/code>\u3002\u56e0\u6b64\uff0c\u5b83\u4e0e\u624b\u52a8\u521b\u5efa\u5e76\u4e0d\u5b8c\u5168\u76f8\u540c\u3002<br \/>\n\u7f16\u7a0b\u8bed\u8a00\u4f1a\u5728\u8bb8\u591a\u5730\u65b9\u68c0\u67e5\u8be5\u5c5e\u6027\u3002\u4f8b\u5982\uff0c\u4e0e\u666e\u901a\u51fd\u6570\u4e0d\u540c\uff0c\u5fc5\u987b\u4f7f\u7528\u00a0<code>new<\/code>\u00a0\u6765\u8c03\u7528\u5b83<\/li>\n<\/ol>\n<pre><code class=\"language-js\">class User {\n  constructor() {}\n}\n\nalert(typeof User); \/\/ function\nUser(); \/\/ Error: Class constructor User cannot be invoked without 'new'\n<\/code><\/pre>\n<ol start=\"2\">\n<li>\u6b64\u5916\uff0c\u5927\u591a\u6570 JavaScript \u5f15\u64ce\u4e2d\u7684\u7c7b\u6784\u9020\u5668\u7684\u5b57\u7b26\u4e32\u8868\u793a\u5f62\u5f0f\u90fd\u4ee5 \u201cclass\u2026\u201d \u5f00\u5934<\/li>\n<\/ol>\n<pre><code class=\"language-js\">class User {\n  constructor() {}\n}\n\nalert(User); \/\/ class User { ... }\n<\/code><\/pre>\n<ol start=\"3\">\n<li>\u7c7b\u65b9\u6cd5\u4e0d\u53ef\u679a\u4e3e\u3002 \u7c7b\u5b9a\u4e49\u5c06\u00a0<code>&quot;prototype&quot;<\/code>\u00a0\u4e2d\u7684\u6240\u6709\u65b9\u6cd5\u7684\u00a0<code>enumerable<\/code>\u00a0\u6807\u5fd7\u8bbe\u7f6e\u4e3a\u00a0<code>false<\/code>\u3002<br \/>\n\u8fd9\u5f88\u597d\uff0c\u56e0\u4e3a\u5982\u679c\u6211\u4eec\u5bf9\u4e00\u4e2a\u5bf9\u8c61\u8c03\u7528\u00a0<code>for..in<\/code>\u00a0\u65b9\u6cd5\uff0c\u6211\u4eec\u901a\u5e38\u4e0d\u5e0c\u671b class \u65b9\u6cd5\u51fa\u73b0\u3002<\/li>\n<li>\u7c7b\u603b\u662f\u4f7f\u7528\u00a0<code>use strict<\/code>\u3002 \u5728\u7c7b\u6784\u9020\u4e2d\u7684\u6240\u6709\u4ee3\u7801\u90fd\u5c06\u81ea\u52a8\u8fdb\u5165\u4e25\u683c\u6a21\u5f0f\u3002<\/li>\n<\/ol>\n<h2>\u7c7b\u8868\u8fbe\u5f0f<\/h2>\n<p>\u5c31\u50cf\u51fd\u6570\u4e00\u6837\uff0c\u7c7b\u53ef\u4ee5\u5728\u53e6\u5916\u4e00\u4e2a\u8868\u8fbe\u5f0f\u4e2d\u88ab\u5b9a\u4e49\uff0c\u88ab\u4f20\u9012\uff0c\u88ab\u8fd4\u56de\uff0c\u88ab\u8d4b\u503c\u7b49\u3002<\/p>\n<pre><code class=\"language-js\">let User = class {\n  sayHi() {\n    alert(&quot;Hello&quot;);\n  }\n};\n<\/code><\/pre>\n<p>\u7c7b\u4f3c\u4e8e\u547d\u540d\u51fd\u6570\u8868\u8fbe\u5f0f\uff08Named Function Expressions\uff09\uff0c\u7c7b\u8868\u8fbe\u5f0f\u53ef\u80fd\u4e5f\u5e94\u8be5\u6709\u4e00\u4e2a\u540d\u5b57\u3002<br \/>\n\u5982\u679c\u7c7b\u8868\u8fbe\u5f0f\u6709\u540d\u5b57\uff0c\u90a3\u4e48\u8be5\u540d\u5b57\u4ec5\u5728\u7c7b\u5185\u90e8\u53ef\u89c1\uff1a<\/p>\n<pre><code class=\"language-js\">\/\/ \u201c\u547d\u540d\u7c7b\u8868\u8fbe\u5f0f\uff08Named Class Expression\uff09\u201d\n\/\/ (\u89c4\u8303\u4e2d\u6ca1\u6709\u8fd9\u6837\u7684\u672f\u8bed\uff0c\u4f46\u662f\u5b83\u548c\u547d\u540d\u51fd\u6570\u8868\u8fbe\u5f0f\u7c7b\u4f3c)\nlet User = class MyClass {\n  sayHi() {\n    alert(MyClass); \/\/ MyClass \u8fd9\u4e2a\u540d\u5b57\u4ec5\u5728\u7c7b\u5185\u90e8\u53ef\u89c1\n  }\n};\n\nnew User().sayHi(); \/\/ \u6b63\u5e38\u8fd0\u884c\uff0c\u663e\u793a MyClass \u4e2d\u5b9a\u4e49\u7684\u5185\u5bb9\n\nalert(MyClass); \/\/ error\uff0cMyClass \u5728\u5916\u90e8\u4e0d\u53ef\u89c1\n<\/code><\/pre>\n<p>\u6211\u4eec\u751a\u81f3\u53ef\u4ee5\u52a8\u6001\u5730\u201c\u6309\u9700\u201d\u521b\u5efa\u7c7b\uff0c\u5c31\u50cf\u8fd9\u6837\uff1a<\/p>\n<pre><code class=\"language-js\">function makeClass(phrase) {\n  \/\/ \u58f0\u660e\u4e00\u4e2a\u7c7b\u5e76\u8fd4\u56de\u5b83\n  return class {\n    sayHi() {\n      alert(phrase);\n    }\n  };\n}\n\n\/\/ \u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u7c7b\nlet User = makeClass(&quot;Hello&quot;);\n\nnew User().sayHi(); \/\/ Hello\n<\/code><\/pre>\n<h2>Getters\/setters<\/h2>\n<p>\u5c31\u50cf\u5bf9\u8c61\u5b57\u9762\u91cf\uff0c\u7c7b\u53ef\u80fd\u5305\u62ec getters\/setters\uff0c\u8ba1\u7b97\u5c5e\u6027\uff08computed properties\uff09\u7b49\u3002<br \/>\n\u8fd9\u662f\u4e00\u4e2a\u4f7f\u7528\u00a0<code>get\/set<\/code>\u00a0\u5b9e\u73b0\u00a0<code>user.name<\/code>\u00a0\u7684\u793a\u4f8b<\/p>\n<pre><code class=\"language-js\">class User {\n\n  constructor(name) {\n    \/\/ \u8c03\u7528 setter\n    this.name = name;\n  }\n\n  get name() {\n    return this._name;\n  }\n\n  set name(value) {\n    if (value.length &lt; 4) {\n      alert(&quot;Name is too short.&quot;);\n      return;\n    }\n    this._name = value;\n  }\n\n}\n\nlet user = new User(&quot;John&quot;);\nalert(user.name); \/\/ John\n\nuser = new User(&quot;&quot;); \/\/ Name is too short.\n<\/code><\/pre>\n<p>\u4ece\u6280\u672f\u4e0a\u6765\u8bb2\uff0c\u8fd9\u6837\u7684\u7c7b\u58f0\u660e\u53ef\u4ee5\u901a\u8fc7\u5728\u00a0<code>User.prototype<\/code>\u00a0\u4e2d\u521b\u5efa getters \u548c setters \u6765\u5b9e\u73b0\u3002<\/p>\n<h2>\u8ba1\u7b97\u5c5e\u6027\u540d\u79f0[...]<\/h2>\n<pre><code class=\"language-js\">class User {\n  ['say' + 'Hi']() {\n    alert(&quot;Hello&quot;);\n  }\n}\n\nnew User().sayHi();\n<\/code><\/pre>\n<p>\u8fd9\u79cd\u7279\u6027\u5f88\u5bb9\u6613\u8bb0\u4f4f\uff0c\u56e0\u4e3a\u5b83\u4eec\u548c\u5bf9\u8c61\u5b57\u9762\u91cf\u7c7b\u4f3c\u3002<\/p>\n<h2>Class \u5b57\u6bb5<\/h2>\n<blockquote>\n<p>\u65e7\u7684\u6d4f\u89c8\u5668\u53ef\u80fd\u9700\u8981 polyfill<br \/>\n\u7c7b\u5b57\u6bb5\uff08field\uff09\u662f\u6700\u8fd1\u624d\u6dfb\u52a0\u5230\u8bed\u8a00\u4e2d\u7684\u3002<\/p>\n<\/blockquote>\n<p>\u4e4b\u524d\uff0c\u6211\u4eec\u7684\u7c7b\u4ec5\u5177\u6709\u65b9\u6cd5\u3002<br \/>\n\u201c\u7c7b\u5b57\u6bb5\u201d\u662f\u4e00\u79cd\u5141\u8bb8\u6dfb\u52a0\u4efb\u4f55\u5c5e\u6027\u7684\u8bed\u6cd5\u3002<br \/>\n\u4f8b\u5982\uff0c\u8ba9\u6211\u4eec\u5728 class User \u4e2d\u6dfb\u52a0\u4e00\u4e2a name \u5c5e\u6027<\/p>\n<pre><code class=\"language-js\">class User {\n  name = &quot;John&quot;;\n\n  sayHi() {\n    alert(`Hello, ${this.name}!`);\n  }\n}\n\nnew User().sayHi(); \/\/ Hello, John!\n<\/code><\/pre>\n<p>\u6240\u4ee5\uff0c\u6211\u4eec\u5c31\u53ea\u9700\u5728\u8868\u8fbe\u5f0f\u4e2d\u5199 &quot;\u00a0=\u00a0&quot;\uff0c\u5c31\u8fd9\u6837\u3002<br \/>\n\u7c7b\u5b57\u6bb5\u91cd\u8981\u7684\u4e0d\u540c\u4e4b\u5904\u5728\u4e8e\uff0c\u5b83\u4eec\u4f1a\u5728\u6bcf\u4e2a\u72ec\u7acb\u5bf9\u8c61\u4e2d\u88ab\u8bbe\u597d\uff0c\u800c\u4e0d\u662f\u8bbe\u5728\u00a0<code>User.prototype<\/code>\uff1a<\/p>\n<pre><code class=\"language-js\">class User {\n  name = &quot;John&quot;;\n}\n\nlet user = new User();\nalert(user.name); \/\/ John\nalert(User.prototype.name); \/\/ undefined\n<\/code><\/pre>\n<h1>\u7c7b\u7ee7\u627f<\/h1>\n<h2>&quot;extends&quot; \u5173\u952e\u5b57<\/h2>\n<pre><code class=\"language-js\">class Animal {\n  constructor(name) {\n    this.speed = 0;\n    this.name = name;\n  }\n  run(speed) {\n    this.speed = speed;\n    alert(`${this.name} runs with speed ${this.speed}.`);\n  }\n  stop() {\n    this.speed = 0;\n    alert(`${this.name} stands still.`);\n  }\n}\n\nlet animal = new Animal(&quot;My animal&quot;);\n<\/code><\/pre>\n<p><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/levin.ink\/wp-content\/uploads\/2024\/06\/Pasted-image-20240618154010.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/levin.ink\/wp-content\/uploads\/2024\/06\/Pasted-image-20240618154010.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"Pasted image 20240618154010.png\"><\/div><br \/>\n\u6269\u5c55\u53e6\u4e00\u4e2a\u7c7b\u7684\u8bed\u6cd5\u662f\uff1a<code>class Child extends Parent<\/code>\u3002<\/p>\n<pre><code class=\"language-js\">class Rabbit extends Animal {\n  hide() {\n    alert(`${this.name} hides!`);\n  }\n}\n\nlet rabbit = new Rabbit(&quot;White Rabbit&quot;);\n\nrabbit.run(5); \/\/ White Rabbit runs with speed 5.\nrabbit.hide(); \/\/ White Rabbit hides!\n<\/code><\/pre>\n<p>\u5728\u5185\u90e8\uff0c\u5173\u952e\u5b57\u00a0<code>extends<\/code>\u00a0\u4f7f\u7528\u4e86\u5f88\u597d\u7684\u65e7\u7684\u539f\u578b\u673a\u5236\u8fdb\u884c\u5de5\u4f5c\u3002\u5b83\u5c06\u00a0<code>Rabbit.prototype.[[Prototype]]<\/code>\u00a0\u8bbe\u7f6e\u4e3a\u00a0<code>Animal.prototype<\/code>\u3002\u6240\u4ee5\uff0c\u5982\u679c\u5728\u00a0<code>Rabbit.prototype<\/code>\u00a0\u4e2d\u627e\u4e0d\u5230\u4e00\u4e2a\u65b9\u6cd5\uff0cJavaScript \u5c31\u4f1a\u4ece\u00a0<code>Animal.prototype<\/code>\u00a0\u4e2d\u83b7\u53d6\u8be5\u65b9\u6cd5\u3002<br \/>\n<div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/levin.ink\/wp-content\/uploads\/2024\/06\/Pasted-image-20240618154237.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/levin.ink\/wp-content\/uploads\/2024\/06\/Pasted-image-20240618154237.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"Pasted image 20240618154237.png\"><\/div><br \/>\n\u4f8b\u5982\uff0c\u8981\u67e5\u627e\u00a0<code>rabbit.run<\/code>\u00a0\u65b9\u6cd5\uff0cJavaScript \u5f15\u64ce\u4f1a\u8fdb\u884c\u5982\u4e0b\u68c0\u67e5\uff08\u5982\u56fe\u6240\u793a\u4ece\u4e0b\u5230\u4e0a\uff09\uff1a<\/p>\n<ol>\n<li>\u67e5\u627e\u5bf9\u8c61\u00a0<code>rabbit<\/code>\uff08\u6ca1\u6709\u00a0<code>run<\/code>\uff09\u3002<\/li>\n<li>\u67e5\u627e\u5b83\u7684\u539f\u578b\uff0c\u5373\u00a0<code>Rabbit.prototype<\/code>\uff08\u6709\u00a0<code>hide<\/code>\uff0c\u4f46\u6ca1\u6709\u00a0<code>run<\/code>\uff09\u3002<\/li>\n<li>\u67e5\u627e\u5b83\u7684\u539f\u578b\uff0c\u5373\uff08\u7531\u4e8e\u00a0<code>extends<\/code>\uff09<code>Animal.prototype<\/code>\uff0c\u5728\u8fd9\u513f\u627e\u5230\u4e86\u00a0<code>run<\/code>\u00a0\u65b9\u6cd5\u3002<br \/>\n\u6211\u4eec\u53ef\u4ee5\u56de\u5fc6\u4e00\u4e0b\u00a0<a href=\"https:\/\/zh.javascript.info\/native-prototypes\">\u539f\u751f\u7684\u539f\u578b<\/a>\u00a0\u8fd9\u4e00\u7ae0\u7684\u5185\u5bb9\uff0cJavaScript \u5185\u5efa\u5bf9\u8c61\u540c\u6837\u4e5f\u4f7f\u7528\u539f\u578b\u7ee7\u627f\u3002\u4f8b\u5982\uff0c<code>Date.prototype.[[Prototype]]<\/code>\u00a0\u662f\u00a0<code>Object.prototype<\/code>\u3002\u8fd9\u5c31\u662f\u4e3a\u4ec0\u4e48\u65e5\u671f\u53ef\u4ee5\u8bbf\u95ee\u901a\u7528\u5bf9\u8c61\u7684\u65b9\u6cd5\u3002<\/li>\n<\/ol>\n<blockquote>\n<p>\u5728\u00a0<code>extends<\/code>\u00a0\u540e\u5141\u8bb8\u4efb\u610f\u8868\u8fbe\u5f0f<br \/>\n\u7c7b\u8bed\u6cd5\u4e0d\u4ec5\u5141\u8bb8\u6307\u5b9a\u4e00\u4e2a\u7c7b\uff0c\u5728\u00a0<code>extends<\/code>\u00a0\u540e\u53ef\u4ee5\u6307\u5b9a\u4efb\u610f\u8868\u8fbe\u5f0f\u3002<br \/>\n\u4f8b\u5982\uff0c\u4e00\u4e2a\u751f\u6210\u7236\u7c7b\u7684\u51fd\u6570\u8c03\u7528\uff1a<\/p>\n<\/blockquote>\n<pre><code class=\"language-js\">function f(phrase) {\n  return class {\n    sayHi() { alert(phrase); }\n  };\n}\n\nclass User extends f(&quot;Hello&quot;) {}\n\nnew User().sayHi(); \/\/ Hello\n<\/code><\/pre>\n<p>\u8fd9\u91cc\u00a0<code>class User<\/code>\u00a0\u7ee7\u627f\u81ea\u00a0<code>f(&quot;Hello&quot;)<\/code>\u00a0\u7684\u7ed3\u679c\u3002<br \/>\n\u8fd9\u5bf9\u4e8e\u9ad8\u7ea7\u7f16\u7a0b\u6a21\u5f0f\uff0c\u4f8b\u5982\u5f53\u6211\u4eec\u6839\u636e\u8bb8\u591a\u6761\u4ef6\u4f7f\u7528\u51fd\u6570\u751f\u6210\u7c7b\uff0c\u5e76\u7ee7\u627f\u5b83\u4eec\u65f6\u6765\u8bf4\u53ef\u80fd\u5f88\u6709\u7528\u3002<\/p>\n<h2>\u91cd\u5199\u65b9\u6cd5<\/h2>\n<p>\u73b0\u5728\uff0c\u8ba9\u6211\u4eec\u7ee7\u7eed\u524d\u884c\u5e76\u5c1d\u8bd5\u91cd\u5199\u4e00\u4e2a\u65b9\u6cd5\u3002\u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff0c\u6240\u6709\u672a\u5728\u00a0<code>class Rabbit<\/code>\u00a0\u4e2d\u6307\u5b9a\u7684\u65b9\u6cd5\u5747\u4ece\u00a0<code>class Animal<\/code>\u00a0\u4e2d\u76f4\u63a5\u83b7\u53d6\u3002<br \/>\n\u4f46\u662f\u5982\u679c\u6211\u4eec\u5728\u00a0<code>Rabbit<\/code>\u00a0\u4e2d\u6307\u5b9a\u4e86\u6211\u4eec\u81ea\u5df1\u7684\u65b9\u6cd5\uff0c\u4f8b\u5982\u00a0<code>stop()<\/code>\uff0c\u90a3\u4e48\u5c06\u4f1a\u4f7f\u7528\u5b83<br \/>\n\u7136\u800c\u901a\u5e38\uff0c\u6211\u4eec\u4e0d\u5e0c\u671b\u5b8c\u5168\u66ff\u6362\u7236\u7c7b\u7684\u65b9\u6cd5\uff0c\u800c\u662f\u5e0c\u671b\u5728\u7236\u7c7b\u65b9\u6cd5\u7684\u57fa\u7840\u4e0a\u8fdb\u884c\u8c03\u6574\u6216\u6269\u5c55\u5176\u529f\u80fd\u3002\u6211\u4eec\u5728\u6211\u4eec\u7684\u65b9\u6cd5\u4e2d\u505a\u4e00\u4e9b\u4e8b\u513f\uff0c\u4f46\u662f\u5728\u5b83\u4e4b\u524d\u6216\u4e4b\u540e\u6216\u5728\u8fc7\u7a0b\u4e2d\u4f1a\u8c03\u7528\u7236\u7c7b\u65b9\u6cd5\u3002<br \/>\nClass \u4e3a\u6b64\u63d0\u4f9b\u4e86\u00a0<code>&quot;super&quot;<\/code>\u00a0\u5173\u952e\u5b57\u3002<\/p>\n<ul>\n<li>\u6267\u884c\u00a0<code>super.method(...)<\/code>\u00a0\u6765\u8c03\u7528\u4e00\u4e2a\u7236\u7c7b\u65b9\u6cd5\u3002<\/li>\n<li>\u6267\u884c\u00a0<code>super(...)<\/code>\u00a0\u6765\u8c03\u7528\u4e00\u4e2a\u7236\u7c7b constructor\uff08\u53ea\u80fd\u5728\u6211\u4eec\u7684 constructor \u4e2d\uff09\u3002<br \/>\n\u4f8b\u5982\uff0c\u8ba9\u6211\u4eec\u7684 rabbit \u5728\u505c\u4e0b\u6765\u7684\u65f6\u5019\u81ea\u52a8 hide\uff1a<\/li>\n<\/ul>\n<pre><code class=\"language-js\">class Animal {\n\n  constructor(name) {\n    this.speed = 0;\n    this.name = name;\n  }\n\n  run(speed) {\n    this.speed = speed;\n    alert(`${this.name} runs with speed ${this.speed}.`);\n  }\n\n  stop() {\n    this.speed = 0;\n    alert(`${this.name} stands still.`);\n  }\n\n}\n\nclass Rabbit extends Animal {\n  hide() {\n    alert(`${this.name} hides!`);\n  }\n\n  stop() {\n    super.stop(); \/\/ \u8c03\u7528\u7236\u7c7b\u7684 stop\n    this.hide(); \/\/ \u7136\u540e hide\n  }\n}\n\nlet rabbit = new Rabbit(&quot;White Rabbit&quot;);\n\nrabbit.run(5); \/\/ White Rabbit runs with speed 5.\nrabbit.stop(); \/\/ White Rabbit stands still. White Rabbit hides!\n<\/code><\/pre>\n<p>\u73b0\u5728\uff0c<code>Rabbit<\/code>\u00a0\u5728\u6267\u884c\u8fc7\u7a0b\u4e2d\u8c03\u7528\u7236\u7c7b\u7684\u00a0<code>super.stop()<\/code>\u00a0\u65b9\u6cd5\uff0c\u6240\u4ee5\u00a0<code>Rabbit<\/code>\u00a0\u4e5f\u5177\u6709\u4e86\u00a0<code>stop<\/code>\u00a0\u65b9\u6cd5\u3002<\/p>\n<blockquote>\n<p>\u7bad\u5934\u51fd\u6570\u6ca1\u6709\u00a0<code>super<\/code><br \/>\n\u6b63\u5982\u6211\u4eec\u5728\u00a0<a href=\"https:\/\/zh.javascript.info\/arrow-functions\">\u6df1\u5165\u7406\u89e3\u7bad\u5934\u51fd\u6570<\/a>\u00a0\u4e00\u7ae0\u4e2d\u6240\u63d0\u5230\u7684\uff0c\u7bad\u5934\u51fd\u6570\u6ca1\u6709\u00a0<code>super<\/code>\u3002<br \/>\n\u5982\u679c\u88ab\u8bbf\u95ee\uff0c\u5b83\u4f1a\u4ece\u5916\u90e8\u51fd\u6570\u83b7\u53d6\u3002\u4f8b\u5982\uff1a<\/p>\n<\/blockquote>\n<pre><code class=\"language-js\">class Rabbit extends Animal {\n  stop() {\n    setTimeout(() =&gt; super.stop(), 1000); \/\/ 1 \u79d2\u540e\u8c03\u7528\u7236\u7c7b\u7684 stop\n  }\n}\n<\/code><\/pre>\n<blockquote>\n<p>\u7bad\u5934\u51fd\u6570\u4e2d\u7684\u00a0<code>super<\/code>\u00a0\u4e0e\u00a0<code>stop()<\/code>\u00a0\u4e2d\u7684\u662f\u4e00\u6837\u7684\uff0c\u6240\u4ee5\u5b83\u80fd\u6309\u9884\u671f\u5de5\u4f5c\u3002\u5982\u679c\u6211\u4eec\u5728\u8fd9\u91cc\u6307\u5b9a\u4e00\u4e2a\u201c\u666e\u901a\u201d\u51fd\u6570\uff0c\u90a3\u4e48\u5c06\u4f1a\u629b\u51fa\u9519\u8bef\uff1a<\/p>\n<\/blockquote>\n<pre><code class=\"language-js\">\/\/ \u610f\u6599\u4e4b\u5916\u7684 super\nsetTimeout(function() { super.stop() }, 1000);\n<\/code><\/pre>\n<h2>\u91cd\u5199 constructor<\/h2>\n<p>\u5bf9\u4e8e\u91cd\u5199 constructor \u6765\u8bf4\uff0c\u5219\u6709\u70b9\u68d8\u624b\u3002<br \/>\n\u5230\u76ee\u524d\u4e3a\u6b62\uff0cRabbit \u8fd8\u6ca1\u6709\u81ea\u5df1\u7684 constructor\u3002<br \/>\n\u6839\u636e \u89c4\u8303\uff0c\u5982\u679c\u4e00\u4e2a\u7c7b\u6269\u5c55\u4e86\u53e6\u4e00\u4e2a\u7c7b\u5e76\u4e14\u6ca1\u6709 constructor\uff0c\u90a3\u4e48\u5c06\u751f\u6210\u4e0b\u9762\u8fd9\u6837\u7684\u201c\u7a7a\u201d constructor\uff1a<\/p>\n<pre><code class=\"language-js\">class Rabbit extends Animal {\n  \/\/ \u4e3a\u6ca1\u6709\u81ea\u5df1\u7684 constructor \u7684\u6269\u5c55\u7c7b\u751f\u6210\u7684\n  constructor(...args) {\n    super(...args);\n  }\n}\n<\/code><\/pre>\n<p>\u6b63\u5982\u6211\u4eec\u6240\u770b\u5230\u7684\uff0c\u5b83\u8c03\u7528\u4e86\u7236\u7c7b\u7684 constructor\uff0c\u5e76\u4f20\u9012\u4e86\u6240\u6709\u7684\u53c2\u6570\u3002\u5982\u679c\u6211\u4eec\u6ca1\u6709\u5199\u81ea\u5df1\u7684 constructor\uff0c\u5c31\u4f1a\u51fa\u73b0\u8fd9\u79cd\u60c5\u51b5\u3002<br \/>\n\u73b0\u5728\uff0c\u6211\u4eec\u7ed9 Rabbit \u6dfb\u52a0\u4e00\u4e2a\u81ea\u5b9a\u4e49\u7684 constructor\u3002\u9664\u4e86 name \u4e4b\u5916\uff0c\u5b83\u8fd8\u4f1a\u6307\u5b9a earLength\u3002<\/p>\n<pre><code class=\"language-js\">class Animal {\n  constructor(name) {\n    this.speed = 0;\n    this.name = name;\n  }\n  \/\/ ...\n}\n\nclass Rabbit extends Animal {\n\n  constructor(name, earLength) {\n    this.speed = 0;\n    this.name = name;\n    this.earLength = earLength;\n  }\n\n  \/\/ ...\n}\n\n\/\/ \u4e0d\u5de5\u4f5c\uff01\nlet rabbit = new Rabbit(&quot;White Rabbit&quot;, 10); \/\/ Error: this is not defined.\n<\/code><\/pre>\n<p>\u54ce\u5466\uff01\u6211\u4eec\u5f97\u5230\u4e86\u4e00\u4e2a\u62a5\u9519\u3002\u73b0\u5728\u6211\u4eec\u6ca1\u6cd5\u65b0\u5efa rabbit\u3002\u662f\u4ec0\u4e48\u5730\u65b9\u51fa\u9519\u4e86\uff1f<br \/>\n\u7b80\u77ed\u7684\u89e3\u91ca\u662f\uff1a<br \/>\n\u7ee7\u627f\u7c7b\u7684 constructor \u5fc5\u987b\u8c03\u7528 super(...)\uff0c\u5e76\u4e14 (!) \u4e00\u5b9a\u8981\u5728\u4f7f\u7528 this \u4e4b\u524d\u8c03\u7528\u3002<br \/>\n\u2026\u2026\u4f46\u8fd9\u662f\u4e3a\u4ec0\u4e48\u5462\uff1f\u8fd9\u91cc\u53d1\u751f\u4e86\u4ec0\u4e48\uff1f\u786e\u5b9e\uff0c\u8fd9\u4e2a\u8981\u6c42\u770b\u8d77\u6765\u5f88\u5947\u602a\u3002<br \/>\n\u5f53\u7136\uff0c\u672c\u6587\u4f1a\u7ed9\u51fa\u4e00\u4e2a\u89e3\u91ca\u3002\u8ba9\u6211\u4eec\u6df1\u5165\u7ec6\u8282\uff0c\u8fd9\u6837\u4f60\u5c31\u53ef\u4ee5\u771f\u6b63\u5730\u7406\u89e3\u53d1\u751f\u4e86\u4ec0\u4e48\u3002<br \/>\n\u5728 JavaScript \u4e2d\uff0c\u7ee7\u627f\u7c7b\uff08\u6240\u8c13\u7684\u201c\u6d3e\u751f\u6784\u9020\u5668\u201d\uff0c\u82f1\u6587\u4e3a \u201cderived constructor\u201d\uff09\u7684\u6784\u9020\u51fd\u6570\u4e0e\u5176\u4ed6\u51fd\u6570\u4e4b\u95f4\u662f\u6709\u533a\u522b\u7684\u3002\u6d3e\u751f\u6784\u9020\u5668\u5177\u6709\u7279\u6b8a\u7684\u5185\u90e8\u5c5e\u6027 [[ConstructorKind]]:&quot;derived&quot;\u3002\u8fd9\u662f\u4e00\u4e2a\u7279\u6b8a\u7684\u5185\u90e8\u6807\u7b7e\u3002<br \/>\n\u8be5\u6807\u7b7e\u4f1a\u5f71\u54cd\u5b83\u7684 new \u884c\u4e3a\uff1a<br \/>\n\u5f53\u901a\u8fc7 new \u6267\u884c\u4e00\u4e2a\u5e38\u89c4\u51fd\u6570\u65f6\uff0c\u5b83\u5c06\u521b\u5efa\u4e00\u4e2a\u7a7a\u5bf9\u8c61\uff0c\u5e76\u5c06\u8fd9\u4e2a\u7a7a\u5bf9\u8c61\u8d4b\u503c\u7ed9 this\u3002<br \/>\n\u4f46\u662f\u5f53\u7ee7\u627f\u7684 constructor \u6267\u884c\u65f6\uff0c\u5b83\u4e0d\u4f1a\u6267\u884c\u6b64\u64cd\u4f5c\u3002\u5b83\u671f\u671b\u7236\u7c7b\u7684 constructor \u6765\u5b8c\u6210\u8fd9\u9879\u5de5\u4f5c\u3002<br \/>\n\u56e0\u6b64\uff0c\u6d3e\u751f\u7684 constructor \u5fc5\u987b\u8c03\u7528 super \u624d\u80fd\u6267\u884c\u5176\u7236\u7c7b\uff08base\uff09\u7684 constructor\uff0c\u5426\u5219 this \u6307\u5411\u7684\u90a3\u4e2a\u5bf9\u8c61\u5c06\u4e0d\u4f1a\u88ab\u521b\u5efa\u3002\u5e76\u4e14\u6211\u4eec\u4f1a\u6536\u5230\u4e00\u4e2a\u62a5\u9519\u3002<br \/>\n\u4e3a\u4e86\u8ba9 Rabbit \u7684 constructor \u53ef\u4ee5\u5de5\u4f5c\uff0c\u5b83\u9700\u8981\u5728\u4f7f\u7528 this \u4e4b\u524d\u8c03\u7528 super()<\/p>\n<pre><code class=\"language-js\">class Animal {\n\n  constructor(name) {\n    this.speed = 0;\n    this.name = name;\n  }\n\n  \/\/ ...\n}\n\nclass Rabbit extends Animal {\n\n  constructor(name, earLength) {\n    super(name);\n    this.earLength = earLength;\n  }\n\n  \/\/ ...\n}\n\n\/\/ \u73b0\u5728\u53ef\u4ee5\u4e86\nlet rabbit = new Rabbit(&quot;White Rabbit&quot;, 10);\nalert(rabbit.name); \/\/ White Rabbit\nalert(rabbit.earLength); \/\/ 10\n<\/code><\/pre>\n<h3>\u91cd\u5199\u7c7b\u5b57\u6bb5\uff1a\u4e00\u4e2a\u68d8\u624b\u7684\u6ce8\u610f\u8981\u70b9<\/h3>\n<p>\u6211\u4eec\u4e0d\u4ec5\u53ef\u4ee5\u91cd\u5199\u65b9\u6cd5\uff0c\u8fd8\u53ef\u4ee5\u91cd\u5199\u7c7b\u5b57\u6bb5\u3002<br \/>\n\u4e0d\u8fc7\uff0c\u5f53\u6211\u4eec\u5728\u7236\u7c7b\u6784\u9020\u5668\u4e2d\u8bbf\u95ee\u4e00\u4e2a\u88ab\u91cd\u5199\u7684\u5b57\u6bb5\u65f6\uff0c\u6709\u4e00\u4e2a\u8be1\u5f02\u7684\u884c\u4e3a\uff0c\u8fd9\u4e0e\u7edd\u5927\u591a\u6570\u5176\u4ed6\u7f16\u7a0b\u8bed\u8a00\u90fd\u5f88\u4e0d\u4e00\u6837\u3002<br \/>\n\u8bf7\u601d\u8003\u6b64\u793a\u4f8b\uff1a<\/p>\n<pre><code class=\"language-js\">class Animal {\n  name = 'animal';\n\n  constructor() {\n    alert(this.name); \/\/ (*)\n  }\n}\n\nclass Rabbit extends Animal {\n  name = 'rabbit';\n}\n\nnew Animal(); \/\/ animal\nnew Rabbit(); \/\/ animal\n<\/code><\/pre>\n<p>\u8fd9\u91cc\uff0cRabbit \u7ee7\u627f\u81ea Animal\uff0c\u5e76\u4e14\u7528\u5b83\u81ea\u5df1\u7684\u503c\u91cd\u5199\u4e86 name \u5b57\u6bb5\u3002<br \/>\n\u56e0\u4e3a Rabbit \u4e2d\u6ca1\u6709\u81ea\u5df1\u7684\u6784\u9020\u5668\uff0c\u6240\u4ee5 Animal \u7684\u6784\u9020\u5668\u88ab\u8c03\u7528\u4e86\u3002<br \/>\n\u6709\u8da3\u7684\u662f\u5728\u8fd9\u4e24\u79cd\u60c5\u51b5\u4e0b\uff1anew Animal() \u548c new Rabbit()\uff0c\u5728 (*) \u884c\u7684 alert \u90fd\u6253\u5370\u4e86 animal\u3002<br \/>\n\u6362\u53e5\u8bdd\u8bf4\uff0c\u7236\u7c7b\u6784\u9020\u5668\u603b\u662f\u4f1a\u4f7f\u7528\u5b83\u81ea\u5df1\u5b57\u6bb5\u7684\u503c\uff0c\u800c\u4e0d\u662f\u88ab\u91cd\u5199\u7684\u90a3\u4e00\u4e2a\u3002<br \/>\n\u53e4\u602a\u7684\u662f\u4ec0\u4e48\u5462\uff1f<br \/>\n\u5982\u679c\u8fd9\u8fd8\u4e0d\u6e05\u695a\uff0c\u90a3\u4e48\u8ba9\u6211\u4eec\u7528\u65b9\u6cd5\u6765\u8fdb\u884c\u6bd4\u8f83\u3002<br \/>\n\u8fd9\u91cc\u662f\u76f8\u540c\u7684\u4ee3\u7801\uff0c\u4f46\u662f\u6211\u4eec\u8c03\u7528 this.showName() \u65b9\u6cd5\u800c\u4e0d\u662f this.name \u5b57\u6bb5\uff1a<\/p>\n<pre><code class=\"language-js\">class Animal {\n  showName() {  \/\/ \u800c\u4e0d\u662f this.name = 'animal'\n    alert('animal');\n  }\n\n  constructor() {\n    this.showName(); \/\/ \u800c\u4e0d\u662f alert(this.name);\n  }\n}\n\nclass Rabbit extends Animal {\n  showName() {\n    alert('rabbit');\n  }\n}\n\nnew Animal(); \/\/ animal\nnew Rabbit(); \/\/ rabbit\n<\/code><\/pre>\n<p>\u8bf7\u6ce8\u610f\uff1a\u8fd9\u65f6\u7684\u8f93\u51fa\u662f\u4e0d\u540c\u7684\u3002<br \/>\n\u8fd9\u624d\u662f\u6211\u4eec\u672c\u6765\u6240\u671f\u5f85\u7684\u7ed3\u679c\u3002\u5f53\u7236\u7c7b\u6784\u9020\u5668\u5728\u6d3e\u751f\u7684\u7c7b\u4e2d\u88ab\u8c03\u7528\u65f6\uff0c\u5b83\u4f1a\u4f7f\u7528\u88ab\u91cd\u5199\u7684\u65b9\u6cd5\u3002<br \/>\n\u2026\u2026\u4f46\u5bf9\u4e8e\u7c7b\u5b57\u6bb5\u5e76\u975e\u5982\u6b64\u3002\u6b63\u5982\u524d\u6587\u6240\u8ff0\uff0c\u7236\u7c7b\u6784\u9020\u5668\u603b\u662f\u4f7f\u7528\u7236\u7c7b\u7684\u5b57\u6bb5\u3002<br \/>\n\u8fd9\u91cc\u4e3a\u4ec0\u4e48\u4f1a\u6709\u8fd9\u6837\u7684\u533a\u522b\u5462\uff1f<br \/>\n\u5b9e\u9645\u4e0a\uff0c\u539f\u56e0\u5728\u4e8e\u5b57\u6bb5\u521d\u59cb\u5316\u7684\u987a\u5e8f\u3002\u7c7b\u5b57\u6bb5\u662f\u8fd9\u6837\u521d\u59cb\u5316\u7684\uff1a<\/p>\n<ul>\n<li>\u5bf9\u4e8e\u57fa\u7c7b\uff08\u8fd8\u672a\u7ee7\u627f\u4efb\u4f55\u4e1c\u897f\u7684\u90a3\u79cd\uff09\uff0c\u5728\u6784\u9020\u51fd\u6570\u8c03\u7528\u524d\u521d\u59cb\u5316\u3002<\/li>\n<li>\u5bf9\u4e8e\u6d3e\u751f\u7c7b\uff0c\u5728\u00a0<code>super()<\/code>\u00a0\u540e\u7acb\u523b\u521d\u59cb\u5316\u3002<br \/>\n\u5728\u6211\u4eec\u7684\u4f8b\u5b50\u4e2d\uff0c<code>Rabbit<\/code>\u00a0\u662f\u6d3e\u751f\u7c7b\uff0c\u91cc\u9762\u6ca1\u6709\u00a0<code>constructor()<\/code>\u3002\u6b63\u5982\u5148\u524d\u6240\u8bf4\uff0c\u8fd9\u76f8\u5f53\u4e8e\u4e00\u4e2a\u91cc\u9762\u53ea\u6709\u00a0<code>super(...args)<\/code>\u00a0\u7684\u7a7a\u6784\u9020\u5668\u3002<br \/>\n\u6240\u4ee5\uff0c<code>new Rabbit()<\/code>\u00a0\u8c03\u7528\u4e86\u00a0<code>super()<\/code>\uff0c\u56e0\u6b64\u5b83\u6267\u884c\u4e86\u7236\u7c7b\u6784\u9020\u5668\uff0c\u5e76\u4e14\uff08\u6839\u636e\u6d3e\u751f\u7c7b\u89c4\u5219\uff09\u53ea\u6709\u5728\u6b64\u4e4b\u540e\uff0c\u5b83\u7684\u7c7b\u5b57\u6bb5\u624d\u88ab\u521d\u59cb\u5316\u3002\u5728\u7236\u7c7b\u6784\u9020\u5668\u88ab\u6267\u884c\u7684\u65f6\u5019\uff0c<code>Rabbit<\/code>\u00a0\u8fd8\u6ca1\u6709\u81ea\u5df1\u7684\u7c7b\u5b57\u6bb5\uff0c\u8fd9\u5c31\u662f\u4e3a\u4ec0\u4e48\u00a0<code>Animal<\/code>\u00a0\u7c7b\u5b57\u6bb5\u88ab\u4f7f\u7528\u4e86\u3002<br \/>\n\u8fd9\u79cd\u5b57\u6bb5\u4e0e\u65b9\u6cd5\u4e4b\u95f4\u5fae\u5999\u7684\u533a\u522b\u53ea\u7279\u5b9a\u4e8e JavaScript\u3002<br \/>\n\u5e78\u8fd0\u7684\u662f\uff0c\u8fd9\u79cd\u884c\u4e3a\u4ec5\u5728\u4e00\u4e2a\u88ab\u91cd\u5199\u7684\u5b57\u6bb5\u88ab\u7236\u7c7b\u6784\u9020\u5668\u4f7f\u7528\u65f6\u624d\u4f1a\u663e\u73b0\u51fa\u6765\u3002\u63a5\u4e0b\u6765\u5b83\u4f1a\u53d1\u751f\u7684\u4e1c\u897f\u53ef\u80fd\u5c31\u6bd4\u8f83\u96be\u7406\u89e3\u4e86\uff0c\u6240\u4ee5\u6211\u4eec\u8981\u5728\u8fd9\u91cc\u5bf9\u6b64\u884c\u4e3a\u8fdb\u884c\u89e3\u91ca\u3002<br \/>\n\u5982\u679c\u51fa\u95ee\u9898\u4e86\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u4f7f\u7528\u65b9\u6cd5\u6216\u8005 getter\/setter \u66ff\u4ee3\u7c7b\u5b57\u6bb5\uff0c\u6765\u4fee\u590d\u8fd9\u4e2a\u95ee\u9898\u3002<\/li>\n<\/ul>\n<h2>\u6df1\u5165\uff1a\u5185\u90e8\u63a2\u7a76\u548c[[HomeObject]]<\/h2>\n<p>\u8ba9\u6211\u4eec\u66f4\u6df1\u5165\u5730\u7814\u7a76 super\u3002\u6211\u4eec\u5c06\u5728\u8fd9\u4e2a\u8fc7\u7a0b\u4e2d\u53d1\u73b0\u4e00\u4e9b\u6709\u8da3\u7684\u4e8b\u513f\u3002<br \/>\n\u9996\u5148\u8981\u8bf4\u7684\u662f\uff0c\u4ece\u6211\u4eec\u8fc4\u4eca\u4e3a\u6b62\u5b66\u5230\u7684\u77e5\u8bc6\u6765\u770b\uff0csuper \u662f\u4e0d\u53ef\u80fd\u8fd0\u884c\u7684\u3002<br \/>\n\u7684\u786e\u662f\u8fd9\u6837\uff0c\u8ba9\u6211\u4eec\u95ee\u95ee\u81ea\u5df1\uff0c\u4ee5\u6280\u672f\u7684\u89d2\u5ea6\u5b83\u662f\u5982\u4f55\u5de5\u4f5c\u7684\uff1f\u5f53\u4e00\u4e2a\u5bf9\u8c61\u65b9\u6cd5\u6267\u884c\u65f6\uff0c\u5b83\u4f1a\u5c06\u5f53\u524d\u5bf9\u8c61\u4f5c\u4e3a this\u3002\u968f\u540e\u5982\u679c\u6211\u4eec\u8c03\u7528 super.method()\uff0c\u90a3\u4e48\u5f15\u64ce\u9700\u8981\u4ece\u5f53\u524d\u5bf9\u8c61\u7684\u539f\u578b\u4e2d\u83b7\u53d6 method\u3002\u4f46\u8fd9\u662f\u600e\u4e48\u505a\u5230\u7684\uff1f<br \/>\n\u8fd9\u4e2a\u4efb\u52a1\u770b\u8d77\u6765\u662f\u633a\u5bb9\u6613\u7684\uff0c\u4f46\u5176\u5b9e\u5e76\u4e0d\u7b80\u5355\u3002\u5f15\u64ce\u77e5\u9053\u5f53\u524d\u5bf9\u8c61\u7684 this\uff0c\u6240\u4ee5\u5b83\u53ef\u4ee5\u83b7\u53d6\u7236 method \u4f5c\u4e3a this.<strong>proto<\/strong>.method\u3002\u4e0d\u5e78\u7684\u662f\uff0c\u8fd9\u4e2a\u201c\u5929\u771f\u201d\u7684\u89e3\u51b3\u65b9\u6cd5\u662f\u884c\u4e0d\u901a\u7684\u3002<br \/>\n\u8ba9\u6211\u4eec\u6f14\u793a\u4e00\u4e0b\u8fd9\u4e2a\u95ee\u9898\u3002\u7b80\u5355\u8d77\u89c1\uff0c\u6211\u4eec\u4f7f\u7528\u666e\u901a\u5bf9\u8c61\u800c\u4e0d\u4f7f\u7528\u7c7b\u3002<br \/>\n\u5982\u679c\u4f60\u4e0d\u60f3\u77e5\u9053\u66f4\u591a\u7684\u7ec6\u8282\u77e5\u8bc6\uff0c\u4f60\u53ef\u4ee5\u8df3\u8fc7\u6b64\u90e8\u5206\uff0c\u5e76\u8f6c\u5230\u4e0b\u9762\u7684 [[HomeObject]] \u5c0f\u8282\u3002\u8fd9\u6ca1\u5173\u7cfb\u7684\u3002\u4f46\u5982\u679c\u4f60\u611f\u5174\u8da3\uff0c\u60f3\u5b66\u4e60\u66f4\u6df1\u5165\u7684\u77e5\u8bc6\uff0c\u90a3\u5c31\u7ee7\u7eed\u9605\u8bfb\u5427\u3002<br \/>\n\u5728\u4e0b\u9762\u7684\u4f8b\u5b50\u4e2d\uff0crabbit.<strong>proto<\/strong> = animal\u3002\u73b0\u5728\u8ba9\u6211\u4eec\u5c1d\u8bd5\u4e00\u4e0b\uff1a\u5728 rabbit.eat() \u6211\u4eec\u5c06\u4f1a\u4f7f\u7528 this.<strong>proto<\/strong> \u8c03\u7528 animal.eat()\uff1a<\/p>\n<pre><code class=\"language-js\">let animal = {\n  name: &quot;Animal&quot;,\n  eat() {\n    alert(`${this.name} eats.`);\n  }\n};\n\nlet rabbit = {\n  __proto__: animal,\n  name: &quot;Rabbit&quot;,\n  eat() {\n    \/\/ \u8fd9\u5c31\u662f super.eat() \u53ef\u4ee5\u5927\u6982\u5de5\u4f5c\u7684\u65b9\u5f0f\n    this.__proto__.eat.call(this); \/\/ (*)\n  }\n};\n\nrabbit.eat(); \/\/ Rabbit eats.\n<\/code><\/pre>\n<p>\u5728 (*) \u8fd9\u4e00\u884c\uff0c\u6211\u4eec\u4ece\u539f\u578b\uff08animal\uff09\u4e2d\u83b7\u53d6 eat\uff0c\u5e76\u5728\u5f53\u524d\u5bf9\u8c61\u7684\u4e0a\u4e0b\u6587\u4e2d\u8c03\u7528\u5b83\u3002\u8bf7\u6ce8\u610f\uff0c.call(this) \u5728\u8fd9\u91cc\u975e\u5e38\u91cd\u8981\uff0c\u56e0\u4e3a\u7b80\u5355\u7684\u8c03\u7528 this.<strong>proto<\/strong>.eat() \u5c06\u5728\u539f\u578b\u7684\u4e0a\u4e0b\u6587\u4e2d\u6267\u884c eat\uff0c\u800c\u975e\u5f53\u524d\u5bf9\u8c61\u3002<br \/>\n\u5728\u4e0a\u9762\u7684\u4ee3\u7801\u4e2d\uff0c\u5b83\u786e\u5b9e\u6309\u7167\u4e86\u671f\u671b\u8fd0\u884c\uff1a\u6211\u4eec\u83b7\u5f97\u4e86\u6b63\u786e\u7684 alert\u3002<br \/>\n\u73b0\u5728\uff0c\u8ba9\u6211\u4eec\u5728\u539f\u578b\u94fe\u4e0a\u518d\u6dfb\u52a0\u4e00\u4e2a\u5bf9\u8c61\u3002\u6211\u4eec\u5c06\u770b\u5230\u8fd9\u4ef6\u4e8b\u662f\u5982\u4f55\u88ab\u6253\u7834\u7684\uff1a<\/p>\n<pre><code class=\"language-js\">let animal = {\n  name: &quot;Animal&quot;,\n  eat() {\n    alert(`${this.name} eats.`);\n  }\n};\n\nlet rabbit = {\n  __proto__: animal,\n  eat() {\n    \/\/ ...bounce around rabbit-style and call parent (animal) method\n    this.__proto__.eat.call(this); \/\/ (*)\n  }\n};\n\nlet longEar = {\n  __proto__: rabbit,\n  eat() {\n    \/\/ ...do something with long ears and call parent (rabbit) method\n    this.__proto__.eat.call(this); \/\/ (**)\n  }\n};\n\nlongEar.eat(); \/\/ Error: Maximum call stack size exceeded\n<\/code><\/pre>\n<p>\u4ee3\u7801\u65e0\u6cd5\u518d\u8fd0\u884c\u4e86\uff01\u6211\u4eec\u53ef\u4ee5\u770b\u5230\uff0c\u5728\u8bd5\u56fe\u8c03\u7528 longEar.eat() \u65f6\u629b\u51fa\u4e86\u9519\u8bef\u3002<br \/>\n\u539f\u56e0\u53ef\u80fd\u4e0d\u90a3\u4e48\u660e\u663e\uff0c\u4f46\u662f\u5982\u679c\u6211\u4eec\u8ddf\u8e2a longEar.eat() \u8c03\u7528\uff0c\u5c31\u53ef\u4ee5\u53d1\u73b0\u539f\u56e0\u3002\u5728 (*) \u548c (**) \u8fd9\u4e24\u884c\u4e2d\uff0cthis \u7684\u503c\u90fd\u662f\u5f53\u524d\u5bf9\u8c61\uff08longEar\uff09\u3002\u8fd9\u662f\u81f3\u5173\u91cd\u8981\u7684\u4e00\u70b9\uff1a\u6240\u6709\u7684\u5bf9\u8c61\u65b9\u6cd5\u90fd\u5c06\u5f53\u524d\u5bf9\u8c61\u4f5c\u4e3a this\uff0c\u800c\u975e\u539f\u578b\u6216\u5176\u4ed6\u4ec0\u4e48\u4e1c\u897f\u3002<br \/>\n\u56e0\u6b64\uff0c\u5728 (*) \u548c (**) \u8fd9\u4e24\u884c\u4e2d\uff0cthis.<strong>proto<\/strong> \u7684\u503c\u662f\u5b8c\u5168\u76f8\u540c\u7684\uff1a\u90fd\u662f rabbit\u3002\u5b83\u4eec\u4fe9\u90fd\u8c03\u7528\u7684\u662f rabbit.eat\uff0c\u5b83\u4eec\u5728\u4e0d\u505c\u5730\u5faa\u73af\u8c03\u7528\u81ea\u5df1\uff0c\u800c\u4e0d\u662f\u5728\u539f\u578b\u94fe\u4e0a\u5411\u4e0a\u5bfb\u627e\u65b9\u6cd5\u3002<br \/>\n<img decoding=\"async\" src=\"https:\/\/levin.ink\/wp-content\/uploads\/2024\/06\/Pasted-image-20240618160428.png\" alt=\"Pasted image 20240618160428.png\">\u8fd9\u4e2a\u95ee\u9898\u6ca1\u6cd5\u4ec5\u4ec5\u901a\u8fc7\u4f7f\u7528\u00a0<code>this<\/code>\u00a0\u6765\u89e3\u51b3\u3002<\/p>\n<h2>[[HomeObject]]<\/h2>\n<p>\u4e3a\u4e86\u63d0\u4f9b\u89e3\u51b3\u65b9\u6cd5\uff0cJavaScript \u4e3a\u51fd\u6570\u6dfb\u52a0\u4e86\u4e00\u4e2a\u7279\u6b8a\u7684\u5185\u90e8\u5c5e\u6027\uff1a<code>[[HomeObject]]<\/code>\u3002<br \/>\n\u5f53\u4e00\u4e2a\u51fd\u6570\u88ab\u5b9a\u4e49\u4e3a\u7c7b\u6216\u8005\u5bf9\u8c61\u65b9\u6cd5\u65f6\uff0c\u5b83\u7684\u00a0<code>[[HomeObject]]<\/code>\u00a0\u5c5e\u6027\u5c31\u6210\u4e3a\u4e86\u8be5\u5bf9\u8c61\u3002<br \/>\n\u7136\u540e\u00a0<code>super<\/code>\u00a0\u4f7f\u7528\u5b83\u6765\u89e3\u6790\uff08resolve\uff09\u7236\u539f\u578b\u53ca\u5176\u65b9\u6cd5\u3002<br \/>\n\u8ba9\u6211\u4eec\u770b\u770b\u5b83\u662f\u600e\u4e48\u5de5\u4f5c\u7684\uff0c\u9996\u5148\uff0c\u5bf9\u4e8e\u666e\u901a\u5bf9\u8c61\uff1a<\/p>\n<pre><code class=\"language-js\">let animal = {\n  name: &quot;Animal&quot;,\n  eat() {         \/\/ animal.eat.[[HomeObject]] == animal\n    alert(`${this.name} eats.`);\n  }\n};\n\nlet rabbit = {\n  __proto__: animal,\n  name: &quot;Rabbit&quot;,\n  eat() {         \/\/ rabbit.eat.[[HomeObject]] == rabbit\n    super.eat();\n  }\n};\n\nlet longEar = {\n  __proto__: rabbit,\n  name: &quot;Long Ear&quot;,\n  eat() {         \/\/ longEar.eat.[[HomeObject]] == longEar\n    super.eat();\n  }\n};\n\n\/\/ \u6b63\u786e\u6267\u884c\nlongEar.eat();  \/\/ Long Ear eats.\n<\/code><\/pre>\n<p>\u5b83\u57fa\u4e8e\u00a0<code>[[HomeObject]]<\/code>\u00a0\u8fd0\u884c\u673a\u5236\u6309\u7167\u9884\u671f\u6267\u884c\u3002\u4e00\u4e2a\u65b9\u6cd5\uff0c\u4f8b\u5982\u00a0<code>longEar.eat<\/code>\uff0c\u77e5\u9053\u5176\u00a0<code>[[HomeObject]]<\/code>\u00a0\u5e76\u4e14\u4ece\u5176\u539f\u578b\u4e2d\u83b7\u53d6\u7236\u65b9\u6cd5\u3002\u5e76\u6ca1\u6709\u4f7f\u7528\u00a0<code>this<\/code>\u3002<\/p>\n<h2>\u65b9\u6cd5\u5e76\u4e0d\u662f\u81ea\u7531\u7684<\/h2>\n<p>\u6b63\u5982\u6211\u4eec\u4e4b\u524d\u6240\u77e5\u9053\u7684\uff0c\u51fd\u6570\u901a\u5e38\u90fd\u662f\u201c\u81ea\u7531\u201d\u7684\uff0c\u5e76\u6ca1\u6709\u7ed1\u5b9a\u5230 JavaScript \u4e2d\u7684\u5bf9\u8c61\u3002\u6b63\u56e0\u5982\u6b64\uff0c\u5b83\u4eec\u53ef\u4ee5\u5728\u5bf9\u8c61\u4e4b\u95f4\u590d\u5236\uff0c\u5e76\u7528\u53e6\u5916\u4e00\u4e2a\u00a0<code>this<\/code>\u00a0\u8c03\u7528\u5b83\u3002<br \/>\n<code>[[HomeObject]]<\/code>\u00a0\u7684\u5b58\u5728\u8fdd\u53cd\u4e86\u8fd9\u4e2a\u539f\u5219\uff0c\u56e0\u4e3a\u65b9\u6cd5\u8bb0\u4f4f\u4e86\u5b83\u4eec\u7684\u5bf9\u8c61\u3002<code>[[HomeObject]]<\/code>\u00a0\u4e0d\u80fd\u88ab\u66f4\u6539\uff0c\u6240\u4ee5\u8fd9\u4e2a\u7ed1\u5b9a\u662f\u6c38\u4e45\u7684\u3002<br \/>\n\u5728 JavaScript \u8bed\u8a00\u4e2d\u00a0<code>[[HomeObject]]<\/code>\u00a0\u4ec5\u88ab\u7528\u4e8e\u00a0<code>super<\/code>\u3002\u6240\u4ee5\uff0c\u5982\u679c\u4e00\u4e2a\u65b9\u6cd5\u4e0d\u4f7f\u7528\u00a0<code>super<\/code>\uff0c\u90a3\u4e48\u6211\u4eec\u4ecd\u7136\u53ef\u4ee5\u89c6\u5b83\u4e3a\u81ea\u7531\u7684\u5e76\u4e14\u53ef\u5728\u5bf9\u8c61\u4e4b\u95f4\u590d\u5236\u3002\u4f46\u662f\u7528\u4e86\u00a0<code>super<\/code>\u00a0\u518d\u8fd9\u6837\u505a\u53ef\u80fd\u5c31\u4f1a\u51fa\u9519\u3002<br \/>\n\u4e0b\u9762\u662f\u590d\u5236\u540e\u9519\u8bef\u7684\u00a0<code>super<\/code>\u00a0\u7ed3\u679c\u7684\u793a\u4f8b\uff1a<\/p>\n<pre><code class=\"language-js\">let animal = {\n  sayHi() {\n    alert(`I'm an animal`);\n  }\n};\n\n\/\/ rabbit \u7ee7\u627f\u81ea animal\nlet rabbit = {\n  __proto__: animal,\n  sayHi() {\n    super.sayHi();\n  }\n};\n\nlet plant = {\n  sayHi() {\n    alert(&quot;I'm a plant&quot;);\n  }\n};\n\n\/\/ tree \u7ee7\u627f\u81ea plant\nlet tree = {\n  __proto__: plant,\n  sayHi: rabbit.sayHi \/\/ (*)\n};\n\ntree.sayHi();  \/\/ I'm an animal (?!?)\n<\/code><\/pre>\n<p>\u8c03\u7528\u00a0<code>tree.sayHi()<\/code>\u00a0\u663e\u793a \u201cI\u2019m an animal\u201d\u3002\u8fd9\u7edd\u5bf9\u662f\u9519\u8bef\u7684\u3002<br \/>\n\u539f\u56e0\u5f88\u7b80\u5355\uff1a<\/p>\n<ul>\n<li>\u5728\u00a0<code>(*)<\/code>\u00a0\u884c\uff0c<code>tree.sayHi<\/code>\u00a0\u65b9\u6cd5\u662f\u4ece\u00a0<code>rabbit<\/code>\u00a0\u590d\u5236\u800c\u6765\u3002\u4e5f\u8bb8\u6211\u4eec\u53ea\u662f\u60f3\u907f\u514d\u91cd\u590d\u4ee3\u7801\uff1f<\/li>\n<li>\u5b83\u7684\u00a0<code>[[HomeObject]]<\/code>\u00a0\u662f\u00a0<code>rabbit<\/code>\uff0c\u56e0\u4e3a\u5b83\u662f\u5728\u00a0<code>rabbit<\/code>\u00a0\u4e2d\u521b\u5efa\u7684\u3002\u6ca1\u6709\u529e\u6cd5\u4fee\u6539\u00a0<code>[[HomeObject]]<\/code>\u3002<\/li>\n<li><code>tree.sayHi()<\/code>\u00a0\u5185\u5177\u6709\u00a0<code>super.sayHi()<\/code>\u3002\u5b83\u4ece\u00a0<code>rabbit<\/code>\u00a0\u4e2d\u4e0a\u6eaf\uff0c\u7136\u540e\u4ece\u00a0<code>animal<\/code>\u00a0\u4e2d\u83b7\u53d6\u65b9\u6cd5\u3002<br \/>\n<img decoding=\"async\" src=\"https:\/\/levin.ink\/wp-content\/uploads\/2024\/06\/Pasted-image-20240618161026.png\" alt=\"Pasted image 20240618161026.png\"><\/li>\n<\/ul>\n<h2>\u65b9\u6cd5\uff0c\u4e0d\u662f\u51fd\u6570\u5c5e\u6027<\/h2>\n<p><code>[[HomeObject]]<\/code>\u00a0\u662f\u4e3a\u7c7b\u548c\u666e\u901a\u5bf9\u8c61\u4e2d\u7684\u65b9\u6cd5\u5b9a\u4e49\u7684\u3002\u4f46\u662f\u5bf9\u4e8e\u5bf9\u8c61\u800c\u8a00\uff0c\u65b9\u6cd5\u5fc5\u987b\u786e\u5207\u6307\u5b9a\u4e3a\u00a0<code>method()<\/code>\uff0c\u800c\u4e0d\u662f\u00a0<code>&quot;method: function()&quot;<\/code>\u3002<br \/>\n\u8fd9\u4e2a\u5dee\u522b\u5bf9\u6211\u4eec\u6765\u8bf4\u53ef\u80fd\u4e0d\u91cd\u8981\uff0c\u4f46\u662f\u5bf9 JavaScript \u6765\u8bf4\u5374\u975e\u5e38\u91cd\u8981\u3002<br \/>\n\u5728\u4e0b\u9762\u7684\u4f8b\u5b50\u4e2d\uff0c\u4f7f\u7528\u975e\u65b9\u6cd5\uff08non-method\uff09\u8bed\u6cd5\u8fdb\u884c\u4e86\u6bd4\u8f83\u3002\u672a\u8bbe\u7f6e\u00a0<code>[[HomeObject]]<\/code>\u00a0\u5c5e\u6027\uff0c\u5e76\u4e14\u7ee7\u627f\u65e0\u6548\uff1a<\/p>\n<pre><code class=\"language-js\">let animal = {\n  eat: function() { \/\/ \u8fd9\u91cc\u662f\u6545\u610f\u8fd9\u6837\u5199\u7684\uff0c\u800c\u4e0d\u662f eat() {...\n    \/\/ ...\n  }\n};\n\nlet rabbit = {\n  __proto__: animal,\n  eat: function() {\n    super.eat();\n  }\n};\n\nrabbit.eat();  \/\/ \u9519\u8bef\u8c03\u7528 super\uff08\u56e0\u4e3a\u8fd9\u91cc\u6ca1\u6709 [[HomeObject]]\uff09\n<\/code><\/pre>\n<h1>\u9759\u6001\u5c5e\u6027\u548c\u9759\u6001\u65b9\u6cd5<\/h1>\n<p>\u6211\u4eec\u53ef\u4ee5\u628a\u4e00\u4e2a\u65b9\u6cd5\u4f5c\u4e3a\u4e00\u4e2a\u6574\u4f53\u8d4b\u503c\u7ed9\u7c7b\u3002\u8fd9\u6837\u7684\u65b9\u6cd5\u88ab\u79f0\u4e3a\u00a0<strong>\u9759\u6001\u7684\uff08static\uff09<\/strong>\u3002<br \/>\n\u5728\u4e00\u4e2a\u7c7b\u7684\u58f0\u660e\u4e2d\uff0c\u5b83\u4eec\u4ee5\u00a0<code>static<\/code>\u00a0\u5173\u952e\u5b57\u5f00\u5934\uff0c\u5982\u4e0b\u6240\u793a\uff1a<\/p>\n<pre><code class=\"language-js\">class User {\n  static staticMethod() {\n    alert(this === User);\n  }\n}\n\nUser.staticMethod(); \/\/ true\n<\/code><\/pre>\n<p>\u8fd9\u5b9e\u9645\u4e0a\u8ddf\u76f4\u63a5\u5c06\u5176\u4f5c\u4e3a\u5c5e\u6027\u8d4b\u503c\u7684\u4f5c\u7528\u76f8\u540c\uff1a<\/p>\n<pre><code class=\"language-js\">class User { }\n\nUser.staticMethod = function() {\n  alert(this === User);\n};\n\nUser.staticMethod(); \/\/ true\n<\/code><\/pre>\n<p>\u5728 User.staticMethod() \u8c03\u7528\u4e2d\u7684 this \u7684\u503c\u662f\u7c7b\u6784\u9020\u5668 User \u81ea\u8eab\uff08\u201c\u70b9\u7b26\u53f7\u524d\u9762\u7684\u5bf9\u8c61\u201d\u89c4\u5219\uff09\u3002<br \/>\n\u901a\u5e38\uff0c\u9759\u6001\u65b9\u6cd5\u7528\u4e8e\u5b9e\u73b0\u5c5e\u4e8e\u6574\u4e2a\u7c7b\uff0c\u4f46\u4e0d\u5c5e\u4e8e\u8be5\u7c7b\u4efb\u4f55\u7279\u5b9a\u5bf9\u8c61\u7684\u51fd\u6570\u3002<br \/>\n\u4f8b\u5982\uff0c\u6211\u4eec\u6709\u5bf9\u8c61 Article\uff0c\u5e76\u4e14\u9700\u8981\u4e00\u4e2a\u65b9\u6cd5\u6765\u6bd4\u8f83\u5b83\u4eec\u3002<br \/>\n\u901a\u5e38\u7684\u89e3\u51b3\u65b9\u6848\u5c31\u662f\u6dfb\u52a0 Article.compare \u9759\u6001\u65b9\u6cd5\uff1a<\/p>\n<pre><code class=\"language-js\">class Article {\n  constructor(title, date) {\n    this.title = title;\n    this.date = date;\n  }\n\n  static compare(articleA, articleB) {\n    return articleA.date - articleB.date;\n  }\n}\n\n\/\/ \u7528\u6cd5\nlet articles = [\n  new Article(&quot;HTML&quot;, new Date(2019, 1, 1)),\n  new Article(&quot;CSS&quot;, new Date(2019, 0, 1)),\n  new Article(&quot;JavaScript&quot;, new Date(2019, 11, 1))\n];\n\narticles.sort(Article.compare);\n\nalert( articles[0].title ); \/\/ CSS\n<\/code><\/pre>\n<p>\u8fd9\u91cc\u00a0<code>Article.compare<\/code>\u00a0\u65b9\u6cd5\u4ee3\u8868\u201c\u4e0a\u9762\u7684\u201d\u6587\u7ae0\uff0c\u610f\u601d\u662f\u6bd4\u8f83\u5b83\u4eec\u3002\u5b83\u4e0d\u662f\u6587\u7ae0\u7684\u65b9\u6cd5\uff0c\u800c\u662f\u6574\u4e2a class \u7684\u65b9\u6cd5\u3002<br \/>\n\u53e6\u4e00\u4e2a\u4f8b\u5b50\u662f\u6240\u8c13\u7684\u201c\u5de5\u5382\u201d\u65b9\u6cd5\u3002<br \/>\n\u6bd4\u5982\u8bf4\uff0c\u6211\u4eec\u9700\u8981\u901a\u8fc7\u591a\u79cd\u65b9\u5f0f\u6765\u521b\u5efa\u4e00\u7bc7\u6587\u7ae0\uff1a<\/p>\n<ol>\n<li>\u901a\u8fc7\u7528\u7ed9\u5b9a\u7684\u53c2\u6570\u6765\u521b\u5efa\uff08<code>title<\/code>\uff0c<code>date<\/code>\u00a0\u7b49\uff09\u3002<\/li>\n<li>\u4f7f\u7528\u4eca\u5929\u7684\u65e5\u671f\u6765\u521b\u5efa\u4e00\u4e2a\u7a7a\u7684\u6587\u7ae0\u3002<\/li>\n<li>\u2026\u2026\u5176\u5b83\u65b9\u6cd5\u3002<br \/>\n\u7b2c\u4e00\u79cd\u65b9\u6cd5\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7 constructor \u6765\u5b9e\u73b0\u3002\u5bf9\u4e8e\u7b2c\u4e8c\u79cd\u65b9\u5f0f\uff0c\u6211\u4eec\u53ef\u4ee5\u521b\u5efa\u7c7b\u7684\u4e00\u4e2a\u9759\u6001\u65b9\u6cd5\u6765\u5b9e\u73b0\u3002<br \/>\n\u4f8b\u5982\u8fd9\u91cc\u7684\u00a0<code>Article.createTodays()<\/code>\uff1a<\/li>\n<\/ol>\n<pre><code class=\"language-js\">class Article {\n  constructor(title, date) {\n    this.title = title;\n    this.date = date;\n  }\n\n  static createTodays() {\n    \/\/ \u8bb0\u4f4f this = Article\n    return new this(&quot;Today's digest&quot;, new Date());\n  }\n}\n\nlet article = Article.createTodays();\n\nalert( article.title ); \/\/ Today's digest\n<\/code><\/pre>\n<p>\u73b0\u5728\uff0c\u6bcf\u5f53\u6211\u4eec\u9700\u8981\u521b\u5efa\u4e00\u4e2a\u4eca\u5929\u7684\u6587\u7ae0\u65f6\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u8c03\u7528\u00a0<code>Article.createTodays()<\/code>\u3002\u518d\u8bf4\u660e\u4e00\u6b21\uff0c\u5b83\u4e0d\u662f\u4e00\u4e2a\u6587\u7ae0\u7684\u65b9\u6cd5\uff0c\u800c\u662f\u6574\u4e2a class \u7684\u65b9\u6cd5\u3002<br \/>\n\u9759\u6001\u65b9\u6cd5\u4e5f\u88ab\u7528\u4e8e\u4e0e\u6570\u636e\u5e93\u76f8\u5173\u7684\u516c\u5171\u7c7b\uff0c\u53ef\u4ee5\u7528\u4e8e\u641c\u7d22\/\u4fdd\u5b58\/\u5220\u9664\u6570\u636e\u5e93\u4e2d\u7684\u6761\u76ee\uff0c \u5c31\u50cf\u8fd9\u6837\uff1a<\/p>\n<pre><code class=\"language-js\">\/\/ \u5047\u5b9a Article \u662f\u4e00\u4e2a\u7528\u6765\u7ba1\u7406\u6587\u7ae0\u7684\u7279\u6b8a\u7c7b\n\/\/ \u901a\u8fc7 id \u6765\u79fb\u9664\u6587\u7ae0\u7684\u9759\u6001\u65b9\u6cd5\uff1a\nArticle.remove({id: 12345});\n<\/code><\/pre>\n<blockquote>\n<p>\u9759\u6001\u65b9\u6cd5\u4e0d\u9002\u7528\u4e8e\u5355\u4e2a\u5bf9\u8c61<br \/>\n\u9759\u6001\u65b9\u6cd5\u53ef\u4ee5\u5728\u7c7b\u4e0a\u8c03\u7528\uff0c\u800c\u4e0d\u662f\u5728\u5355\u4e2a\u5bf9\u8c61\u4e0a\u3002<br \/>\n\u4f8b\u5982\uff0c\u8fd9\u6837\u7684\u4ee3\u7801\u65e0\u6cd5\u6b63\u5e38\u5de5\u4f5c\uff1a<\/p>\n<\/blockquote>\n<pre><code class=\"language-js\">\/\/ ...\narticle.createTodays(); \/\/\/ Error: article.createTodays is not a function\n<\/code><\/pre>\n<h2>\u9759\u6001\u5c5e\u6027<\/h2>\n<p>\u9759\u6001\u7684\u5c5e\u6027\u4e5f\u662f\u53ef\u80fd\u7684\uff0c\u5b83\u4eec\u770b\u8d77\u6765\u5c31\u50cf\u5e38\u89c4\u7684\u7c7b\u5c5e\u6027\uff0c\u4f46\u524d\u9762\u52a0\u6709\u00a0<code>static<\/code><\/p>\n<pre><code class=\"language-js\">class Article {\n  static publisher = &quot;Levi Ding&quot;;\n}\n\nalert( Article.publisher ); \/\/ Levi Ding\n<\/code><\/pre>\n<p>\u8fd9\u7b49\u540c\u4e8e\u76f4\u63a5\u7ed9\u00a0<code>Article<\/code>\u00a0\u8d4b\u503c<\/p>\n<pre><code class=\"language-js\">Article.publisher = &quot;Levi Ding&quot;;\n<\/code><\/pre>\n<h2>\u7ee7\u627f\u9759\u6001\u5c5e\u6027\u548c\u65b9\u6cd5<\/h2>\n<p>\u9759\u6001\u5c5e\u6027\u548c\u65b9\u6cd5\u662f\u53ef\u88ab\u7ee7\u627f\u7684\u3002<br \/>\n\u4f8b\u5982\uff0c\u4e0b\u9762\u8fd9\u6bb5\u4ee3\u7801\u4e2d\u7684\u00a0<code>Animal.compare<\/code>\u00a0\u548c\u00a0<code>Animal.planet<\/code>\u00a0\u662f\u53ef\u88ab\u7ee7\u627f\u7684\uff0c\u53ef\u4ee5\u901a\u8fc7\u00a0<code>Rabbit.compare<\/code>\u00a0\u548c\u00a0<code>Rabbit.planet<\/code>\u00a0\u6765\u8bbf\u95ee\uff1a<\/p>\n<pre><code class=\"language-js\">class Animal {\n  static planet = &quot;Earth&quot;;\n\n  constructor(name, speed) {\n    this.speed = speed;\n    this.name = name;\n  }\n\n  run(speed = 0) {\n    this.speed += speed;\n    alert(`${this.name} runs with speed ${this.speed}.`);\n  }\n\n  static compare(animalA, animalB) {\n    return animalA.speed - animalB.speed;\n  }\n\n}\n\n\/\/ \u7ee7\u627f\u4e8e Animal\nclass Rabbit extends Animal {\n  hide() {\n    alert(`${this.name} hides!`);\n  }\n}\n\nlet rabbits = [\n  new Rabbit(&quot;White Rabbit&quot;, 10),\n  new Rabbit(&quot;Black Rabbit&quot;, 5)\n];\n\nrabbits.sort(Rabbit.compare);\n\nrabbits[0].run(); \/\/ Black Rabbit runs with speed 5.\n\nalert(Rabbit.planet); \/\/ Earth\n<\/code><\/pre>\n<p>\u73b0\u5728\u6211\u4eec\u8c03\u7528\u00a0<code>Rabbit.compare<\/code>\u00a0\u65f6\uff0c\u7ee7\u627f\u7684\u00a0<code>Animal.compare<\/code>\u00a0\u5c06\u4f1a\u88ab\u8c03\u7528\u3002<br \/>\n\u5b83\u662f\u5982\u4f55\u5de5\u4f5c\u7684\uff1f\u518d\u6b21\uff0c\u4f7f\u7528\u539f\u578b\u3002\u4f60\u53ef\u80fd\u5df2\u7ecf\u731c\u5230\u4e86\uff0c<code>extends<\/code>\u00a0\u8ba9\u00a0<code>Rabbit<\/code>\u00a0\u7684\u00a0<code>[[Prototype]]<\/code>\u00a0\u6307\u5411\u4e86\u00a0<code>Animal<\/code>\u3002<br \/>\n<div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/levin.ink\/wp-content\/uploads\/2024\/06\/Pasted-image-20240618163031.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/levin.ink\/wp-content\/uploads\/2024\/06\/Pasted-image-20240618163031.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"Pasted image 20240618163031.png\"><\/div><br \/>\n\u6240\u4ee5\uff0c<code>Rabbit extends Animal<\/code>\u00a0\u521b\u5efa\u4e86\u4e24\u4e2a\u00a0<code>[[Prototype]]<\/code>\u00a0\u5f15\u7528\uff1a<\/p>\n<ol>\n<li><code>Rabbit<\/code>\u00a0\u51fd\u6570\u539f\u578b\u7ee7\u627f\u81ea\u00a0<code>Animal<\/code>\u00a0\u51fd\u6570\u3002<\/li>\n<li><code>Rabbit.prototype<\/code>\u00a0\u539f\u578b\u7ee7\u627f\u81ea\u00a0<code>Animal.prototype<\/code>\u3002<br \/>\n\u7ed3\u679c\u5c31\u662f\uff0c\u7ee7\u627f\u5bf9\u5e38\u89c4\u65b9\u6cd5\u548c\u9759\u6001\u65b9\u6cd5\u90fd\u6709\u6548\u3002<\/li>\n<\/ol>\n<h1>\u79c1\u6709\u7684\u548c\u53d7\u4fdd\u62a4\u7684\u5c5e\u6027\u548c\u65b9\u6cd5<\/h1>\n<p>\u9762\u5411\u5bf9\u8c61\u7f16\u7a0b\u6700\u91cd\u8981\u7684\u539f\u5219\u4e4b\u4e00 \u2014\u2014 \u5c06\u5185\u90e8\u63a5\u53e3\u4e0e\u5916\u90e8\u63a5\u53e3\u5206\u9694\u5f00\u6765\u3002<br \/>\n\u5728\u5f00\u53d1\u6bd4 \u201chello world\u201d \u5e94\u7528\u7a0b\u5e8f\u66f4\u590d\u6742\u7684\u4e1c\u897f\u65f6\uff0c\u8fd9\u662f\u201c\u5fc5\u987b\u201d\u9075\u5b88\u7684\u505a\u6cd5\u3002<br \/>\n\u4e3a\u4e86\u7406\u89e3\u8fd9\u4e00\u70b9\uff0c\u8ba9\u6211\u4eec\u8131\u79bb\u5f00\u53d1\u8fc7\u7a0b\uff0c\u628a\u76ee\u5149\u8f6c\u5411\u73b0\u5b9e\u4e16\u754c\u3002<br \/>\n\u901a\u5e38\uff0c\u6211\u4eec\u4f7f\u7528\u7684\u8bbe\u5907\u90fd\u975e\u5e38\u590d\u6742\u3002\u4f46\u662f\uff0c\u5c06\u5185\u90e8\u63a5\u53e3\u4e0e\u5916\u90e8\u63a5\u53e3\u5206\u9694\u5f00\u6765\u53ef\u4ee5\u8ba9\u6211\u4eec\u4f7f\u7528\u5b83\u4eec\u4e14\u6ca1\u6709\u4efb\u4f55\u95ee\u9898\u3002<\/p>\n<h2>\u5185\u90e8\u63a5\u53e3\u548c\u5916\u90e8\u63a5\u53e3<\/h2>\n<p>\u5728\u9762\u5411\u5bf9\u8c61\u7684\u7f16\u7a0b\u4e2d\uff0c\u5c5e\u6027\u548c\u65b9\u6cd5\u5206\u4e3a\u4e24\u7ec4\uff1a<\/p>\n<ul>\n<li><strong>\u5185\u90e8\u63a5\u53e3<\/strong>\u00a0\u2014\u2014 \u53ef\u4ee5\u901a\u8fc7\u8be5\u7c7b\u7684\u5176\u4ed6\u65b9\u6cd5\u8bbf\u95ee\uff0c\u4f46\u4e0d\u80fd\u4ece\u5916\u90e8\u8bbf\u95ee\u7684\u65b9\u6cd5\u548c\u5c5e\u6027\u3002<\/li>\n<li><strong>\u5916\u90e8\u63a5\u53e3<\/strong>\u00a0\u2014\u2014 \u4e5f\u53ef\u4ee5\u4ece\u7c7b\u7684\u5916\u90e8\u8bbf\u95ee\u7684\u65b9\u6cd5\u548c\u5c5e\u6027\u3002<br \/>\n\u5185\u90e8\u63a5\u53e3\u7528\u4e8e\u5bf9\u8c61\u5de5\u4f5c\uff0c\u5b83\u7684\u7ec6\u8282\u76f8\u4e92\u4f7f\u7528\u3002<br \/>\n\u6240\u4ee5\uff0c\u6211\u4eec\u9700\u8981\u4f7f\u7528\u4e00\u4e2a\u5bf9\u8c61\u65f6\u53ea\u9700\u77e5\u9053\u5b83\u7684\u5916\u90e8\u63a5\u53e3\u3002\u6211\u4eec\u53ef\u80fd\u5b8c\u5168\u4e0d\u77e5\u9053\u5b83\u7684\u5185\u90e8\u662f\u5982\u4f55\u5de5\u4f5c\u7684\uff0c\u8fd9\u592a\u597d\u4e86\u3002<br \/>\n\u8fd9\u662f\u4e2a\u6982\u62ec\u6027\u7684\u4ecb\u7ecd\u3002<br \/>\n\u5728 JavaScript \u4e2d\uff0c\u6709\u4e24\u79cd\u7c7b\u578b\u7684\u5bf9\u8c61\u5b57\u6bb5\uff08\u5c5e\u6027\u548c\u65b9\u6cd5\uff09\uff1a<\/li>\n<li>\u516c\u5171\u7684\uff1a\u53ef\u4ece\u4efb\u4f55\u5730\u65b9\u8bbf\u95ee\u3002\u5b83\u4eec\u6784\u6210\u4e86\u5916\u90e8\u63a5\u53e3\u3002\u5230\u76ee\u524d\u4e3a\u6b62\uff0c\u6211\u4eec\u53ea\u4f7f\u7528\u4e86\u516c\u5171\u7684\u5c5e\u6027\u548c\u65b9\u6cd5\u3002<\/li>\n<li>\u79c1\u6709\u7684\uff1a\u53ea\u80fd\u4ece\u7c7b\u7684\u5185\u90e8\u8bbf\u95ee\u3002\u8fd9\u4e9b\u7528\u4e8e\u5185\u90e8\u63a5\u53e3\u3002<br \/>\n\u5728\u8bb8\u591a\u5176\u4ed6\u7f16\u7a0b\u8bed\u8a00\u4e2d\uff0c\u8fd8\u5b58\u5728\u201c\u53d7\u4fdd\u62a4\u201d\u7684\u5b57\u6bb5\uff1a\u53ea\u80fd\u4ece\u7c7b\u7684\u5185\u90e8\u548c\u57fa\u4e8e\u5176\u6269\u5c55\u7684\u7c7b\u7684\u5185\u90e8\u8bbf\u95ee\uff08\u4f8b\u5982\u79c1\u6709\u7684\uff0c\u4f46\u53ef\u4ee5\u4ece\u7ee7\u627f\u7684\u7c7b\u8fdb\u884c\u8bbf\u95ee\uff09\u3002\u5b83\u4eec\u5bf9\u4e8e\u5185\u90e8\u63a5\u53e3\u4e5f\u5f88\u6709\u7528\u3002\u4ece\u67d0\u79cd\u610f\u4e49\u4e0a\u8bb2\uff0c\u5b83\u4eec\u6bd4\u79c1\u6709\u7684\u5c5e\u6027\u548c\u65b9\u6cd5\u66f4\u4e3a\u5e7f\u6cdb\uff0c\u56e0\u4e3a\u6211\u4eec\u901a\u5e38\u5e0c\u671b\u7ee7\u627f\u7c7b\u6765\u8bbf\u95ee\u5b83\u4eec\u3002<br \/>\n\u53d7\u4fdd\u62a4\u7684\u5b57\u6bb5\u4e0d\u662f\u5728\u8bed\u8a00\u7ea7\u522b\u7684 Javascript \u4e2d\u5b9e\u73b0\u7684\uff0c\u4f46\u5b9e\u9645\u4e0a\u5b83\u4eec\u975e\u5e38\u65b9\u4fbf\uff0c\u56e0\u4e3a\u5b83\u4eec\u662f\u5728 Javascript \u4e2d\u6a21\u62df\u7684\u7c7b\u5b9a\u4e49\u8bed\u6cd5\u3002<br \/>\n\u73b0\u5728\uff0c\u6211\u4eec\u5c06\u4f7f\u7528\u6240\u6709\u8fd9\u4e9b\u7c7b\u578b\u7684\u5c5e\u6027\u5728 Javascript \u4e2d\u5236\u4f5c\u5496\u5561\u673a\u3002\u5496\u5561\u673a\u6709\u5f88\u591a\u7ec6\u8282\uff0c\u6211\u4eec\u4e0d\u4f1a\u5bf9\u5b83\u4eec\u8fdb\u884c\u5168\u9762\u6a21\u62df\u4ee5\u4fdd\u6301\u7b80\u6d01\uff08\u5c3d\u7ba1\u6211\u4eec\u53ef\u4ee5\uff09\u3002<\/li>\n<\/ul>\n<h2>\u53d7\u4fdd\u62a4\u7684 &quot;waterAmount&quot;<\/h2>\n<p>\u9996\u5148\uff0c\u8ba9\u6211\u4eec\u505a\u4e00\u4e2a\u7b80\u5355\u7684\u5496\u5561\u673a\u7c7b\uff1a<\/p>\n<pre><code class=\"language-js\">class CoffeeMachine {\n  waterAmount = 0; \/\/ \u5185\u90e8\u7684\u6c34\u91cf\n\n  constructor(power) {\n    this.power = power;\n    alert( `Created a coffee-machine, power: ${power}` );\n  }\n\n}\n\n\/\/ \u521b\u5efa\u5496\u5561\u673a\nlet coffeeMachine = new CoffeeMachine(100);\n\n\/\/ \u52a0\u6c34\ncoffeeMachine.waterAmount = 200;\n<\/code><\/pre>\n<p>\u73b0\u5728\uff0c\u5c5e\u6027 waterAmount \u548c power \u662f\u516c\u5171\u7684\u3002\u6211\u4eec\u53ef\u4ee5\u8f7b\u677e\u5730\u4ece\u5916\u90e8\u5c06\u5b83\u4eec get\/set \u6210\u4efb\u4f55\u503c\u3002<br \/>\n\u8ba9\u6211\u4eec\u5c06 waterAmount \u5c5e\u6027\u66f4\u6539\u4e3a\u53d7\u4fdd\u62a4\u7684\u5c5e\u6027\uff0c\u4ee5\u5bf9\u5176\u8fdb\u884c\u66f4\u591a\u63a7\u5236\u3002\u4f8b\u5982\uff0c\u6211\u4eec\u4e0d\u5e0c\u671b\u4efb\u4f55\u4eba\u5c06\u5b83\u7684\u503c\u8bbe\u7f6e\u4e3a\u5c0f\u4e8e\u96f6\u7684\u6570\u3002<br \/>\n\u53d7\u4fdd\u62a4\u7684\u5c5e\u6027\u901a\u5e38\u4ee5\u4e0b\u5212\u7ebf _ \u4f5c\u4e3a\u524d\u7f00\u3002<br \/>\n\u8fd9\u4e0d\u662f\u5728\u8bed\u8a00\u7ea7\u522b\u5f3a\u5236\u5b9e\u65bd\u7684\uff0c\u4f46\u662f\u7a0b\u5e8f\u5458\u4e4b\u95f4\u6709\u4e00\u4e2a\u4f17\u6240\u5468\u77e5\u7684\u7ea6\u5b9a\uff0c\u5373\u4e0d\u5e94\u8be5\u4ece\u5916\u90e8\u8bbf\u95ee\u6b64\u7c7b\u578b\u7684\u5c5e\u6027\u548c\u65b9\u6cd5\u3002<br \/>\n\u6240\u4ee5\u6211\u4eec\u7684\u5c5e\u6027\u5c06\u88ab\u547d\u540d\u4e3a _waterAmount<\/p>\n<pre><code class=\"language-js\">class CoffeeMachine {\n  _waterAmount = 0;\n\n  set waterAmount(value) {\n    if (value &lt; 0) {\n      value = 0;\n    }\n    this._waterAmount = value;\n  }\n\n  get waterAmount() {\n    return this._waterAmount;\n  }\n\n  constructor(power) {\n    this._power = power;\n  }\n\n}\n\n\/\/ \u521b\u5efa\u5496\u5561\u673a\nlet coffeeMachine = new CoffeeMachine(100);\n\n\/\/ \u52a0\u6c34\ncoffeeMachine.waterAmount = -10; \/\/ _waterAmount \u5c06\u53d8\u4e3a 0\uff0c\u800c\u4e0d\u662f -10\n<\/code><\/pre>\n<p>\u73b0\u5728\u8bbf\u95ee\u5df2\u53d7\u5230\u63a7\u5236\uff0c\u56e0\u6b64\u5c06\u6c34\u91cf\u7684\u503c\u8bbe\u7f6e\u4e3a\u5c0f\u4e8e\u96f6\u7684\u6570\u53d8\u5f97\u4e0d\u53ef\u80fd\u3002<\/p>\n<h2>\u53ea\u8bfb\u7684 &quot;power&quot;<\/h2>\n<p>\u5bf9\u4e8e\u00a0<code>power<\/code>\u00a0\u5c5e\u6027\uff0c\u8ba9\u6211\u4eec\u5c06\u5b83\u8bbe\u4e3a\u53ea\u8bfb\u3002\u6709\u65f6\u5019\u4e00\u4e2a\u5c5e\u6027\u5fc5\u987b\u53ea\u80fd\u88ab\u5728\u521b\u5efa\u65f6\u8fdb\u884c\u8bbe\u7f6e\uff0c\u4e4b\u540e\u4e0d\u518d\u88ab\u4fee\u6539\u3002<br \/>\n\u5496\u5561\u673a\u5c31\u662f\u8fd9\u79cd\u60c5\u51b5\uff1a\u529f\u7387\u6c38\u8fdc\u4e0d\u4f1a\u6539\u53d8\u3002<br \/>\n\u8981\u505a\u5230\u8fd9\u4e00\u70b9\uff0c\u6211\u4eec\u53ea\u9700\u8981\u8bbe\u7f6e getter\uff0c\u800c\u4e0d\u8bbe\u7f6e setter\uff1a<\/p>\n<pre><code class=\"language-js\">class CoffeeMachine {\n  \/\/ ...\n\n  constructor(power) {\n    this._power = power;\n  }\n\n  get power() {\n    return this._power;\n  }\n\n}\n\n\/\/ \u521b\u5efa\u5496\u5561\u673a\nlet coffeeMachine = new CoffeeMachine(100);\n\nalert(`Power is: ${coffeeMachine.power}W`); \/\/ \u529f\u7387\u662f\uff1a100W\n\ncoffeeMachine.power = 25; \/\/ Error\uff08\u6ca1\u6709 setter\uff09\n<\/code><\/pre>\n<blockquote>\n<p>getter\/setter \u51fd\u6570<br \/>\n\u8fd9\u91cc\u6211\u4eec\u4f7f\u7528\u4e86 getter\/setter \u8bed\u6cd5\u3002<br \/>\n\u4f46\u5927\u591a\u6570\u65f6\u5019\u9996\u9009\u00a0<code>get...\/set...<\/code>\u00a0\u51fd\u6570\uff0c\u50cf\u8fd9\u6837\uff1a<\/p>\n<\/blockquote>\n<pre><code class=\"language-js\">class CoffeeMachine {\n  _waterAmount = 0;\n\n  setWaterAmount(value) {\n    if (value &lt; 0) value = 0;\n    this._waterAmount = value;\n  }\n\n  getWaterAmount() {\n    return this._waterAmount;\n  }\n}\n\nnew CoffeeMachine().setWaterAmount(100);\n<\/code><\/pre>\n<blockquote>\n<p>\u8fd9\u770b\u8d77\u6765\u6709\u70b9\u957f\uff0c\u4f46\u51fd\u6570\u66f4\u7075\u6d3b\u3002\u5b83\u4eec\u53ef\u4ee5\u63a5\u53d7\u591a\u4e2a\u53c2\u6570\uff08\u5373\u4f7f\u6211\u4eec\u73b0\u5728\u8fd8\u4e0d\u9700\u8981\uff09\u3002<br \/>\n\u53e6\u4e00\u65b9\u9762\uff0cget\/set \u8bed\u6cd5\u66f4\u77ed\uff0c\u6240\u4ee5\u6700\u7ec8\u6ca1\u6709\u4e25\u683c\u7684\u89c4\u5b9a\uff0c\u800c\u662f\u7531\u4f60\u81ea\u5df1\u6765\u51b3\u5b9a\u3002<\/p>\n<\/blockquote>\n<blockquote>\n<p>\u53d7\u4fdd\u62a4\u7684\u5b57\u6bb5\u662f\u53ef\u4ee5\u88ab\u7ee7\u627f\u7684<br \/>\n\u5982\u679c\u6211\u4eec\u7ee7\u627f\u00a0<code>class MegaMachine extends CoffeeMachine<\/code>\uff0c\u90a3\u4e48\u4ec0\u4e48\u90fd\u65e0\u6cd5\u963b\u6b62\u6211\u4eec\u4ece\u65b0\u7684\u7c7b\u4e2d\u7684\u65b9\u6cd5\u8bbf\u95ee\u00a0<code>this._waterAmount<\/code>\u00a0\u6216\u00a0<code>this._power<\/code>\u3002<br \/>\n\u6240\u4ee5\u53d7\u4fdd\u62a4\u7684\u5b57\u6bb5\u662f\u81ea\u7136\u53ef\u88ab\u7ee7\u627f\u7684\u3002\u4e0e\u6211\u4eec\u63a5\u4e0b\u6765\u5c06\u770b\u5230\u7684\u79c1\u6709\u5b57\u6bb5\u4e0d\u540c\u3002<\/p>\n<\/blockquote>\n<h2>\u79c1\u6709\u7684 &quot;#waterLimit&quot;<\/h2>\n<blockquote>\n<p>\u6700\u8fd1\u65b0\u589e\u7684\u7279\u6027<br \/>\n\u8fd9\u662f\u4e00\u4e2a\u6700\u8fd1\u6dfb\u52a0\u5230 JavaScript \u7684\u7279\u6027\u3002 JavaScript \u5f15\u64ce\u4e0d\u652f\u6301\uff08\u6216\u90e8\u5206\u652f\u6301\uff09\uff0c\u9700\u8981 polyfills\u3002<\/p>\n<\/blockquote>\n<p>\u8fd9\u513f\u6709\u4e00\u4e2a\u9a6c\u4e0a\u5c31\u4f1a\u88ab\u52a0\u5230\u89c4\u8303\u4e2d\u7684\u5df2\u5b8c\u6210\u7684 Javascript \u63d0\u6848\uff0c\u5b83\u4e3a\u79c1\u6709\u5c5e\u6027\u548c\u65b9\u6cd5\u63d0\u4f9b\u8bed\u8a00\u7ea7\u652f\u6301\u3002<br \/>\n\u79c1\u6709\u5c5e\u6027\u548c\u65b9\u6cd5\u5e94\u8be5\u4ee5\u00a0<code>#<\/code>\u00a0\u5f00\u5934\u3002\u5b83\u4eec\u53ea\u5728\u7c7b\u7684\u5185\u90e8\u53ef\u88ab\u8bbf\u95ee\u3002<br \/>\n\u4f8b\u5982\uff0c\u8fd9\u513f\u6709\u4e00\u4e2a\u79c1\u6709\u5c5e\u6027\u00a0<code>#waterLimit<\/code>\u00a0\u548c\u68c0\u67e5\u6c34\u91cf\u7684\u79c1\u6709\u65b9\u6cd5\u00a0<code>#fixWaterAmount<\/code><\/p>\n<pre><code class=\"language-js\">class CoffeeMachine {\n  #waterLimit = 200;\n\n  #fixWaterAmount(value) {\n    if (value &lt; 0) return 0;\n    if (value &gt; this.#waterLimit) return this.#waterLimit;\n  }\n\n  setWaterAmount(value) {\n    this.#waterLimit = this.#fixWaterAmount(value);\n  }\n}\n\nlet coffeeMachine = new CoffeeMachine();\n\n\/\/ \u4e0d\u80fd\u4ece\u7c7b\u7684\u5916\u90e8\u8bbf\u95ee\u7c7b\u7684\u79c1\u6709\u5c5e\u6027\u548c\u65b9\u6cd5\ncoffeeMachine.#fixWaterAmount(123); \/\/ Error\ncoffeeMachine.#waterLimit = 1000; \/\/ Error\n<\/code><\/pre>\n<p>\u5728\u8bed\u8a00\u7ea7\u522b\uff0c<code>#<\/code>\u00a0\u662f\u8be5\u5b57\u6bb5\u4e3a\u79c1\u6709\u7684\u7279\u6b8a\u6807\u5fd7\u3002\u6211\u4eec\u65e0\u6cd5\u4ece\u5916\u90e8\u6216\u4ece\u7ee7\u627f\u7684\u7c7b\u4e2d\u8bbf\u95ee\u5b83\u3002<br \/>\n\u79c1\u6709\u5b57\u6bb5\u4e0e\u516c\u5171\u5b57\u6bb5\u4e0d\u4f1a\u53d1\u751f\u51b2\u7a81\u3002\u6211\u4eec\u53ef\u4ee5\u540c\u65f6\u62e5\u6709\u79c1\u6709\u7684\u00a0<code>#waterAmount<\/code>\u00a0\u548c\u516c\u5171\u7684\u00a0<code>waterAmount<\/code>\u00a0\u5b57\u6bb5\u3002<br \/>\n\u4f8b\u5982\uff0c\u8ba9\u6211\u4eec\u4f7f\u00a0<code>waterAmount<\/code>\u00a0\u6210\u4e3a\u00a0<code>#waterAmount<\/code>\u00a0\u7684\u4e00\u4e2a\u8bbf\u95ee\u5668\uff1a<\/p>\n<pre><code class=\"language-js\">class CoffeeMachine {\n\n  #waterAmount = 0;\n\n  get waterAmount() {\n    return this.#waterAmount;\n  }\n\n  set waterAmount(value) {\n    if (value &lt; 0) value = 0;\n    this.#waterAmount = value;\n  }\n}\n\nlet machine = new CoffeeMachine();\n\nmachine.waterAmount = 100;\nalert(machine.#waterAmount); \/\/ Error\n<\/code><\/pre>\n<p>\u4e0e\u53d7\u4fdd\u62a4\u7684\u5b57\u6bb5\u4e0d\u540c\uff0c\u79c1\u6709\u5b57\u6bb5\u7531\u8bed\u8a00\u672c\u8eab\u5f3a\u5236\u6267\u884c\u3002\u8fd9\u662f\u597d\u4e8b\u513f\u3002<br \/>\n\u4f46\u662f\u5982\u679c\u6211\u4eec\u7ee7\u627f\u81ea\u00a0<code>CoffeeMachine<\/code>\uff0c\u90a3\u4e48\u6211\u4eec\u5c06\u65e0\u6cd5\u76f4\u63a5\u8bbf\u95ee\u00a0<code>#waterAmount<\/code>\u3002\u6211\u4eec\u9700\u8981\u4f9d\u9760\u00a0<code>waterAmount<\/code>\u00a0getter\/setter\uff1a<br \/>\n\u5728\u8bb8\u591a\u60c5\u51b5\u4e0b\uff0c\u8fd9\u79cd\u9650\u5236\u592a\u4e25\u91cd\u4e86\u3002\u5982\u679c\u6211\u4eec\u6269\u5c55\u00a0<code>CoffeeMachine<\/code>\uff0c\u5219\u53ef\u80fd\u6709\u6b63\u5f53\u7406\u7531\u8bbf\u95ee\u5176\u5185\u90e8\u3002\u8fd9\u5c31\u662f\u4e3a\u4ec0\u4e48\u5927\u591a\u6570\u65f6\u5019\u90fd\u4f1a\u4f7f\u7528\u53d7\u4fdd\u62a4\u5b57\u6bb5\uff0c\u5373\u4f7f\u5b83\u4eec\u4e0d\u53d7\u8bed\u8a00\u8bed\u6cd5\u7684\u652f\u6301\u3002<\/p>\n<blockquote>\n<p>\u79c1\u6709\u5b57\u6bb5\u4e0d\u80fd\u901a\u8fc7 this[name] \u8bbf\u95ee<br \/>\n\u79c1\u6709\u5b57\u6bb5\u5f88\u7279\u522b\u3002<br \/>\n\u6b63\u5982\u6211\u4eec\u6240\u77e5\u9053\u7684\uff0c\u901a\u5e38\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u00a0<code>this[name]<\/code>\u00a0\u8bbf\u95ee\u5b57\u6bb5\uff1a<\/p>\n<\/blockquote>\n<pre><code class=\"language-js\">class User {\n  ...\n  sayHi() {\n    let fieldName = &quot;name&quot;;\n    alert(`Hello, ${this[fieldName]}`);\n  }\n}\n<\/code><\/pre>\n<blockquote>\n<p>\u5bf9\u4e8e\u79c1\u6709\u5b57\u6bb5\u6765\u8bf4\uff0c\u8fd9\u662f\u4e0d\u53ef\u80fd\u7684\uff1a<code>this['#name']<\/code>\u00a0\u4e0d\u8d77\u4f5c\u7528\u3002\u8fd9\u662f\u786e\u4fdd\u79c1\u6709\u6027\u7684\u8bed\u6cd5\u9650\u5236\u3002<\/p>\n<\/blockquote>\n<h1>\u6269\u5c55\u5185\u5efa\u7c7b<\/h1>\n<p>\u5185\u5efa\u7684\u7c7b\uff0c\u4f8b\u5982<code>Array<\/code>\uff0c<code>Map<\/code>\u00a0\u7b49\u4e5f\u90fd\u662f\u53ef\u4ee5\u6269\u5c55\u7684\uff08extendable\uff09\u3002<br \/>\n\u4f8b\u5982\uff0c\u8fd9\u91cc\u6709\u4e00\u4e2a\u7ee7\u627f\u81ea\u539f\u751f\u00a0<code>Array<\/code>\u00a0\u7684\u7c7b\u00a0<code>PowerArray<\/code>\uff1a<\/p>\n<pre><code class=\"language-js\">\/\/ \u7ed9 PowerArray \u65b0\u589e\u4e86\u4e00\u4e2a\u65b9\u6cd5\uff08\u53ef\u4ee5\u589e\u52a0\u66f4\u591a\uff09\nclass PowerArray extends Array {\n  isEmpty() {\n    return this.length === 0;\n  }\n}\n\nlet arr = new PowerArray(1, 2, 5, 10, 50);\nalert(arr.isEmpty()); \/\/ false\n\nlet filteredArr = arr.filter(item =&gt; item &gt;= 10);\nalert(filteredArr); \/\/ 10, 50\nalert(filteredArr.isEmpty()); \/\/ false\n<\/code><\/pre>\n<p>\u8bf7\u6ce8\u610f\u4e00\u4e2a\u975e\u5e38\u6709\u8da3\u7684\u4e8b\u513f\u3002\u5185\u5efa\u7684\u65b9\u6cd5\u4f8b\u5982\u00a0<code>filter<\/code>\uff0c<code>map<\/code>\u00a0\u7b49 \u2014\u2014 \u8fd4\u56de\u7684\u6b63\u662f\u5b50\u7c7b\u00a0<code>PowerArray<\/code>\u00a0\u7684\u65b0\u5bf9\u8c61\u3002\u5b83\u4eec\u5185\u90e8\u4f7f\u7528\u4e86\u5bf9\u8c61\u7684\u00a0<code>constructor<\/code>\u00a0\u5c5e\u6027\u6765\u5b9e\u73b0\u8fd9\u4e00\u529f\u80fd\u3002<br \/>\n\u5728\u4e0a\u9762\u7684\u4f8b\u5b50\u4e2d\uff0c<\/p>\n<pre><code class=\"language-js\">arr.constructor === PowerArray\n<\/code><\/pre>\n<p>\u5f53\u00a0<code>arr.filter()<\/code>\u00a0\u88ab\u8c03\u7528\u65f6\uff0c\u5b83\u7684\u5185\u90e8\u4f7f\u7528\u7684\u662f\u00a0<code>arr.constructor<\/code>\u00a0\u6765\u521b\u5efa\u65b0\u7684\u7ed3\u679c\u6570\u7ec4\uff0c\u800c\u4e0d\u662f\u4f7f\u7528\u539f\u751f\u7684\u00a0<code>Array<\/code>\u3002\u8fd9\u771f\u7684\u5f88\u9177\uff0c\u56e0\u4e3a\u6211\u4eec\u53ef\u4ee5\u5728\u7ed3\u679c\u6570\u7ec4\u4e0a\u7ee7\u7eed\u4f7f\u7528\u00a0<code>PowerArray<\/code>\u00a0\u7684\u65b9\u6cd5\u3002<br \/>\n\u751a\u81f3\uff0c\u6211\u4eec\u53ef\u4ee5\u5b9a\u5236\u8fd9\u79cd\u884c\u4e3a\u3002<br \/>\n\u6211\u4eec\u53ef\u4ee5\u7ed9\u8fd9\u4e2a\u7c7b\u6dfb\u52a0\u4e00\u4e2a\u7279\u6b8a\u7684\u9759\u6001 getter\u00a0<code>Symbol.species<\/code>\u3002\u5982\u679c\u5b58\u5728\uff0c\u5219\u5e94\u8fd4\u56de JavaScript \u5728\u5185\u90e8\u7528\u6765\u5728\u00a0<code>map<\/code>\u00a0\u548c\u00a0<code>filter<\/code>\u00a0\u7b49\u65b9\u6cd5\u4e2d\u521b\u5efa\u65b0\u5b9e\u4f53\u7684\u00a0<code>constructor<\/code>\u3002<br \/>\n\u5982\u679c\u6211\u4eec\u5e0c\u671b\u50cf\u00a0<code>map<\/code>\u00a0\u6216\u00a0<code>filter<\/code>\u00a0\u8fd9\u6837\u7684\u5185\u5efa\u65b9\u6cd5\u8fd4\u56de\u5e38\u89c4\u6570\u7ec4\uff0c\u6211\u4eec\u53ef\u4ee5\u5728\u00a0<code>Symbol.species<\/code>\u00a0\u4e2d\u8fd4\u56de\u00a0<code>Array<\/code>\uff0c\u5c31\u50cf\u8fd9\u6837\uff1a<\/p>\n<pre><code class=\"language-js\">class PowerArray extends Array {\n  isEmpty() {\n    return this.length === 0;\n  }\n\n  \/\/ \u5185\u5efa\u65b9\u6cd5\u5c06\u4f7f\u7528\u8fd9\u4e2a\u4f5c\u4e3a constructor\n  static get [Symbol.species]() {\n    return Array;\n  }\n}\n\nlet arr = new PowerArray(1, 2, 5, 10, 50);\nalert(arr.isEmpty()); \/\/ false\n\n\/\/ filter \u4f7f\u7528 arr.constructor[Symbol.species] \u4f5c\u4e3a constructor \u521b\u5efa\u65b0\u6570\u7ec4\nlet filteredArr = arr.filter(item =&gt; item &gt;= 10);\n\n\/\/ filteredArr \u4e0d\u662f PowerArray\uff0c\u800c\u662f Array\nalert(filteredArr.isEmpty()); \/\/ Error: filteredArr.isEmpty is not a function\n<\/code><\/pre>\n<p>\u6b63\u5982\u4f60\u6240\u770b\u5230\u7684\uff0c\u73b0\u5728\u00a0<code>.filter<\/code>\u00a0\u8fd4\u56de\u00a0<code>Array<\/code>\u3002\u6240\u4ee5\u6269\u5c55\u7684\u529f\u80fd\u4e0d\u518d\u4f20\u9012\u3002<\/p>\n<blockquote>\n<p>\u5176\u4ed6\u96c6\u5408\u7684\u5de5\u4f5c\u65b9\u5f0f\u7c7b\u4f3c<br \/>\n\u5176\u4ed6\u96c6\u5408\uff0c\u4f8b\u5982\u00a0<code>Map<\/code>\u00a0\u548c\u00a0<code>Set<\/code>\u00a0\u7684\u5de5\u4f5c\u65b9\u5f0f\u7c7b\u4f3c\u3002\u5b83\u4eec\u4e5f\u4f7f\u7528\u00a0<code>Symbol.species<\/code>\u3002<\/p>\n<\/blockquote>\n<h2>\u5185\u5efa\u7c7b\u6ca1\u6709\u9759\u6001\u65b9\u6cd5\u7ee7\u627f<\/h2>\n<p>\u5185\u5efa\u5bf9\u8c61\u6709\u5b83\u4eec\u81ea\u5df1\u7684\u9759\u6001\u65b9\u6cd5\uff0c\u4f8b\u5982\u00a0<code>Object.keys<\/code>\uff0c<code>Array.isArray<\/code>\u00a0\u7b49\u3002<br \/>\n\u5982\u6211\u4eec\u6240\u77e5\u9053\u7684\uff0c\u539f\u751f\u7684\u7c7b\u4e92\u76f8\u6269\u5c55\u3002\u4f8b\u5982\uff0c<code>Array<\/code>\u00a0\u6269\u5c55\u81ea\u00a0<code>Object<\/code>\u3002<br \/>\n\u901a\u5e38\uff0c\u5f53\u4e00\u4e2a\u7c7b\u6269\u5c55\u53e6\u4e00\u4e2a\u7c7b\u65f6\uff0c\u9759\u6001\u65b9\u6cd5\u548c\u975e\u9759\u6001\u65b9\u6cd5\u90fd\u4f1a\u88ab\u7ee7\u627f\u3002\u8fd9\u5df2\u7ecf\u5728\u00a0<a href=\"https:\/\/zh.javascript.info\/static-properties-methods#statics-and-inheritance\">\u9759\u6001\u5c5e\u6027\u548c\u9759\u6001\u65b9\u6cd5<\/a>\u00a0\u4e2d\u8be6\u7ec6\u5730\u89e3\u91ca\u8fc7\u4e86\u3002<br \/>\n\u4f46\u5185\u5efa\u7c7b\u5374\u662f\u4e00\u4e2a\u4f8b\u5916\u3002\u5b83\u4eec\u76f8\u4e92\u95f4\u4e0d\u7ee7\u627f\u9759\u6001\u65b9\u6cd5\u3002<br \/>\n\u4f8b\u5982\uff0c<code>Array<\/code>\u00a0\u548c\u00a0<code>Date<\/code>\u00a0\u90fd\u7ee7\u627f\u81ea\u00a0<code>Object<\/code>\uff0c\u6240\u4ee5\u5b83\u4eec\u7684\u5b9e\u4f8b\u90fd\u6709\u6765\u81ea\u00a0<code>Object.prototype<\/code>\u00a0\u7684\u65b9\u6cd5\u3002\u4f46\u00a0<code>Array.[[Prototype]]<\/code>\u00a0\u5e76\u4e0d\u6307\u5411\u00a0<code>Object<\/code>\uff0c\u6240\u4ee5\u5b83\u4eec\u6ca1\u6709\u4f8b\u5982\u00a0<code>Array.keys()<\/code>\uff08\u6216\u00a0<code>Date.keys()<\/code>\uff09\u8fd9\u4e9b\u9759\u6001\u65b9\u6cd5\u3002<br \/>\n\u8fd9\u91cc\u6709\u4e00\u5f20\u00a0<code>Date<\/code>\u00a0\u548c\u00a0<code>Object<\/code>\u00a0\u7684\u7ed3\u6784\u5173\u7cfb\u56fe\uff1a<br \/>\n<div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/levin.ink\/wp-content\/uploads\/2024\/06\/Pasted-image-20240619142504.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/levin.ink\/wp-content\/uploads\/2024\/06\/Pasted-image-20240619142504.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"Pasted image 20240619142504.png\"><\/div><br \/>\n\u6b63\u5982\u4f60\u6240\u770b\u5230\u7684\uff0c<code>Date<\/code>\u00a0\u548c\u00a0<code>Object<\/code>\u00a0\u4e4b\u95f4\u6ca1\u6709\u8fde\u7ed3\u3002\u5b83\u4eec\u662f\u72ec\u7acb\u7684\uff0c\u53ea\u6709\u00a0<code>Date.prototype<\/code>\u00a0\u7ee7\u627f\u81ea\u00a0<code>Object.prototype<\/code>\uff0c\u4ec5\u6b64\u800c\u5df2\u3002<br \/>\n\u4e0e\u6211\u4eec\u6240\u4e86\u89e3\u7684\u901a\u8fc7\u00a0<code>extends<\/code>\u00a0\u83b7\u5f97\u7684\u7ee7\u627f\u76f8\u6bd4\uff0c\u8fd9\u662f\u5185\u5efa\u5bf9\u8c61\u4e4b\u95f4\u7ee7\u627f\u7684\u4e00\u4e2a\u91cd\u8981\u533a\u522b\u3002<\/p>\n<h1>\u7c7b\u68c0\u67e5 instanceof<\/h1>\n<p><code>instanceof<\/code>\u00a0\u64cd\u4f5c\u7b26\u7528\u4e8e\u68c0\u67e5\u4e00\u4e2a\u5bf9\u8c61\u662f\u5426\u5c5e\u4e8e\u67d0\u4e2a\u7279\u5b9a\u7684 class\u3002\u540c\u65f6\uff0c\u5b83\u8fd8\u8003\u8651\u4e86\u7ee7\u627f\u3002<br \/>\n\u5728\u8bb8\u591a\u60c5\u51b5\u4e0b\uff0c\u53ef\u80fd\u90fd\u9700\u8981\u8fdb\u884c\u6b64\u7c7b\u68c0\u67e5\u3002\u4f8b\u5982\uff0c\u5b83\u53ef\u4ee5\u88ab\u7528\u6765\u6784\u5efa\u4e00\u4e2a\u00a0<strong>\u591a\u6001\u6027\uff08polymorphic\uff09<\/strong>\u00a0\u7684\u51fd\u6570\uff0c\u8be5\u51fd\u6570\u6839\u636e\u53c2\u6570\u7684\u7c7b\u578b\u5bf9\u53c2\u6570\u8fdb\u884c\u4e0d\u540c\u7684\u5904\u7406\u3002<\/p>\n<h2>instanceof \u64cd\u4f5c\u7b26<\/h2>\n<p>\u8bed\u6cd5\uff1a<\/p>\n<pre><code class=\"language-js\">obj instanceof Class\n<\/code><\/pre>\n<p>\u5982\u679c\u00a0<code>obj<\/code>\u00a0\u96b6\u5c5e\u4e8e\u00a0<code>Class<\/code>\u00a0\u7c7b\uff08\u6216\u00a0<code>Class<\/code>\u00a0\u7c7b\u7684\u884d\u751f\u7c7b\uff09\uff0c\u5219\u8fd4\u56de\u00a0<code>true<\/code>\u3002<\/p>\n<pre><code class=\"language-js\">class Rabbit {}\nlet rabbit = new Rabbit();\n\n\/\/ rabbit \u662f Rabbit class \u7684\u5bf9\u8c61\u5417\uff1f\nalert( rabbit instanceof Rabbit ); \/\/ true\n<\/code><\/pre>\n<p>\u5b83\u8fd8\u53ef\u4ee5\u4e0e\u6784\u9020\u51fd\u6570\u4e00\u8d77\u4f7f\u7528\uff1a<\/p>\n<pre><code class=\"language-js\">\/\/ \u8fd9\u91cc\u662f\u6784\u9020\u51fd\u6570\uff0c\u800c\u4e0d\u662f class\nfunction Rabbit() {}\n\nalert( new Rabbit() instanceof Rabbit ); \/\/ true\n<\/code><\/pre>\n<p>\u2026\u2026\u4e0e\u8bf8\u5982\u00a0<code>Array<\/code>\u00a0\u4e4b\u7c7b\u7684\u5185\u5efa class \u4e00\u8d77\u4f7f\u7528\uff1a<\/p>\n<pre><code class=\"language-js\">let arr = [1, 2, 3];\nalert( arr instanceof Array ); \/\/ true\nalert( arr instanceof Object ); \/\/ true\n<\/code><\/pre>\n<p>\u6709\u4e00\u70b9\u9700\u8981\u7559\u610f\uff0c<code>arr<\/code>\u00a0\u540c\u65f6\u8fd8\u96b6\u5c5e\u4e8e\u00a0<code>Object<\/code>\u00a0\u7c7b\u3002\u56e0\u4e3a\u4ece\u539f\u578b\u4e0a\u6765\u8bb2\uff0c<code>Array<\/code>\u00a0\u662f\u7ee7\u627f\u81ea\u00a0<code>Object<\/code>\u00a0\u7684\u3002<br \/>\n\u901a\u5e38\uff0c<code>instanceof<\/code>\u00a0\u5728\u68c0\u67e5\u4e2d\u4f1a\u5c06\u539f\u578b\u94fe\u8003\u8651\u5728\u5185\u3002\u6b64\u5916\uff0c\u6211\u4eec\u8fd8\u53ef\u4ee5\u5728\u9759\u6001\u65b9\u6cd5\u00a0<code>Symbol.hasInstance<\/code>\u00a0\u4e2d\u8bbe\u7f6e\u81ea\u5b9a\u4e49\u903b\u8f91\u3002<br \/>\n<code>obj instanceof Class<\/code>\u00a0\u7b97\u6cd5\u7684\u6267\u884c\u8fc7\u7a0b\u5927\u81f4\u5982\u4e0b\uff1a<\/p>\n<ol>\n<li>\u5982\u679c\u8fd9\u513f\u6709\u9759\u6001\u65b9\u6cd5\u00a0<code>Symbol.hasInstance<\/code>\uff0c\u90a3\u5c31\u76f4\u63a5\u8c03\u7528\u8fd9\u4e2a\u65b9\u6cd5\uff1a<\/li>\n<\/ol>\n<pre><code class=\"language-js\">\/\/ \u8bbe\u7f6e instanceOf \u68c0\u67e5\n\/\/ \u5e76\u5047\u8bbe\u5177\u6709 canEat \u5c5e\u6027\u7684\u90fd\u662f animal\nclass Animal {\n  static [Symbol.hasInstance](obj) {\n    if (obj.canEat) return true;\n  }\n}\n\nlet obj = { canEat: true };\n\nalert(obj instanceof Animal); \/\/ true\uff1aAnimal[Symbol.hasInstance](obj) \u88ab\u8c03\u7528\n<\/code><\/pre>\n<ol start=\"2\">\n<li>\u5927\u591a\u6570 class \u6ca1\u6709\u00a0<code>Symbol.hasInstance<\/code>\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u6807\u51c6\u7684\u903b\u8f91\u662f\uff1a\u4f7f\u7528\u00a0<code>obj instanceOf Class<\/code>\u00a0\u68c0\u67e5\u00a0<code>Class.prototype<\/code>\u00a0\u662f\u5426\u7b49\u4e8e\u00a0<code>obj<\/code>\u00a0\u7684\u539f\u578b\u94fe\u4e2d\u7684\u539f\u578b\u4e4b\u4e00\u3002\u6362\u53e5\u8bdd\u8bf4\u5c31\u662f\uff0c\u4e00\u4e2a\u63a5\u4e00\u4e2a\u5730\u6bd4\u8f83\uff1a<\/li>\n<\/ol>\n<pre><code class=\"language-js\">obj.__proto__ === Class.prototype?\nobj.__proto__.__proto__ === Class.prototype?\nobj.__proto__.__proto__.__proto__ === Class.prototype?\n...\n\/\/ \u5982\u679c\u4efb\u610f\u4e00\u4e2a\u7684\u7b54\u6848\u4e3a true\uff0c\u5219\u8fd4\u56de true\n\/\/ \u5426\u5219\uff0c\u5982\u679c\u6211\u4eec\u5df2\u7ecf\u68c0\u67e5\u5230\u4e86\u539f\u578b\u94fe\u7684\u5c3e\u7aef\uff0c\u5219\u8fd4\u56de false\n<\/code><\/pre>\n<p>\u5728\u4e0a\u9762\u90a3\u4e2a\u4f8b\u5b50\u4e2d\uff0c<code>rabbit.__proto__ === Rabbit.prototype<\/code>\uff0c\u6240\u4ee5\u7acb\u5373\u5c31\u7ed9\u51fa\u4e86\u7ed3\u679c\u3002<br \/>\n\u800c\u5728\u7ee7\u627f\u7684\u4f8b\u5b50\u4e2d\uff0c\u5339\u914d\u5c06\u5728\u7b2c\u4e8c\u6b65\u8fdb\u884c\uff1a<\/p>\n<pre><code class=\"language-js\">class Animal {}\nclass Rabbit extends Animal {}\n\nlet rabbit = new Rabbit();\nalert(rabbit instanceof Animal); \/\/ true\n\n\/\/ rabbit.__proto__ === Animal.prototype\uff08\u65e0\u5339\u914d\uff09\n\/\/ rabbit.__proto__.__proto__ === Animal.prototype\uff08\u5339\u914d\uff01\uff09\n<\/code><\/pre>\n<p>\u4e0b\u56fe\u5c55\u793a\u4e86\u00a0<code>rabbit instanceof Animal<\/code>\u00a0\u7684\u6267\u884c\u8fc7\u7a0b\u4e2d\uff0c<code>Animal.prototype<\/code>\u00a0\u662f\u5982\u4f55\u53c2\u4e0e\u6bd4\u8f83\u7684\uff1a<br \/>\n<div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/levin.ink\/wp-content\/uploads\/2024\/06\/Pasted-image-20240619143354.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/levin.ink\/wp-content\/uploads\/2024\/06\/Pasted-image-20240619143354.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"Pasted image 20240619143354.png\"><\/div><br \/>\n\u8fd9\u91cc\u8fd8\u8981\u63d0\u5230\u4e00\u4e2a\u65b9\u6cd5\u00a0<a href=\"https:\/\/developer.mozilla.org\/zh\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/object\/isPrototypeOf\">objA.isPrototypeOf(objB)<\/a>\uff0c\u5982\u679c\u00a0<code>objA<\/code>\u00a0\u5904\u5728\u00a0<code>objB<\/code>\u00a0\u7684\u539f\u578b\u94fe\u4e2d\uff0c\u5219\u8fd4\u56de\u00a0<code>true<\/code>\u3002\u6240\u4ee5\uff0c\u53ef\u4ee5\u5c06\u00a0<code>obj instanceof Class<\/code>\u00a0\u68c0\u67e5\u6539\u4e3a\u00a0<code>Class.prototype.isPrototypeOf(obj)<\/code>\u3002<br \/>\n\u8fd9\u5f88\u6709\u8da3\uff0c\u4f46\u662f\u00a0<code>Class<\/code>\u00a0\u7684 constructor \u81ea\u8eab\u662f\u4e0d\u53c2\u4e0e\u68c0\u67e5\u7684\uff01\u68c0\u67e5\u8fc7\u7a0b\u53ea\u548c\u539f\u578b\u94fe\u4ee5\u53ca\u00a0<code>Class.prototype<\/code>\u00a0\u6709\u5173\u3002<br \/>\n\u521b\u5efa\u5bf9\u8c61\u540e\uff0c\u5982\u679c\u66f4\u6539\u00a0<code>prototype<\/code>\u00a0\u5c5e\u6027\uff0c\u53ef\u80fd\u4f1a\u5bfc\u81f4\u6709\u8da3\u7684\u7ed3\u679c\u3002<br \/>\n\u5c31\u50cf\u8fd9\u6837\uff1a<\/p>\n<pre><code class=\"language-js\">function Rabbit() {}\nlet rabbit = new Rabbit();\n\n\/\/ \u4fee\u6539\u4e86 prototype\nRabbit.prototype = {};\n\n\/\/ ...\u518d\u4e5f\u4e0d\u662f rabbit \u4e86\uff01\nalert( rabbit instanceof Rabbit ); \/\/ false\n<\/code><\/pre>\n<h2>\u798f\u5229\uff1a\u4f7f\u7528 Object.prototype.toString \u65b9\u6cd5\u6765\u63ed\u793a\u7c7b\u578b<\/h2>\n<p>\u5927\u5bb6\u90fd\u77e5\u9053\uff0c\u4e00\u4e2a\u666e\u901a\u5bf9\u8c61\u88ab\u8f6c\u5316\u4e3a\u5b57\u7b26\u4e32\u65f6\u4e3a\u00a0<code>[object Object]<\/code>\uff1a<\/p>\n<pre><code class=\"language-js\">let obj = {};\n\nalert(obj); \/\/ [object Object]\nalert(obj.toString()); \/\/ \u540c\u4e0a\n<\/code><\/pre>\n<p>\u8fd9\u662f\u901a\u8fc7\u00a0<code>toString<\/code>\u00a0\u65b9\u6cd5\u5b9e\u73b0\u7684\u3002\u4f46\u662f\u8fd9\u513f\u6709\u4e00\u4e2a\u9690\u85cf\u7684\u529f\u80fd\uff0c\u8be5\u529f\u80fd\u53ef\u4ee5\u4f7f\u00a0<code>toString<\/code>\u00a0\u5b9e\u9645\u4e0a\u6bd4\u8fd9\u66f4\u5f3a\u5927\u3002\u6211\u4eec\u53ef\u4ee5\u5c06\u5176\u4f5c\u4e3a\u00a0<code>typeof<\/code>\u00a0\u7684\u589e\u5f3a\u7248\u6216\u8005\u00a0<code>instanceof<\/code>\u00a0\u7684\u66ff\u4ee3\u65b9\u6cd5\u6765\u4f7f\u7528\u3002<br \/>\n\u542c\u8d77\u6765\u633a\u4e0d\u53ef\u601d\u8bae\uff1f\u90a3\u662f\u81ea\u7136\uff0c\u7cbe\u5f69\u9a6c\u4e0a\u63ed\u6653\u3002<br \/>\n\u6309\u7167\u00a0<a href=\"https:\/\/tc39.github.io\/ecma262\/#sec-object.prototype.tostring\">\u89c4\u8303<\/a>\u00a0\u6240\u8bb2\uff0c\u5185\u5efa\u7684\u00a0<code>toString<\/code>\u00a0\u65b9\u6cd5\u53ef\u4ee5\u88ab\u4ece\u5bf9\u8c61\u4e2d\u63d0\u53d6\u51fa\u6765\uff0c\u5e76\u5728\u4efb\u4f55\u5176\u4ed6\u503c\u7684\u4e0a\u4e0b\u6587\u4e2d\u6267\u884c\u3002\u5176\u7ed3\u679c\u53d6\u51b3\u4e8e\u8be5\u503c\u3002<\/p>\n<ul>\n<li>\u5bf9\u4e8e number \u7c7b\u578b\uff0c\u7ed3\u679c\u662f\u00a0<code>[object Number]<\/code><\/li>\n<li>\u5bf9\u4e8e boolean \u7c7b\u578b\uff0c\u7ed3\u679c\u662f\u00a0<code>[object Boolean]<\/code><\/li>\n<li>\u5bf9\u4e8e\u00a0<code>null<\/code>\uff1a<code>[object Null]<\/code><\/li>\n<li>\u5bf9\u4e8e\u00a0<code>undefined<\/code>\uff1a<code>[object Undefined]<\/code><\/li>\n<li>\u5bf9\u4e8e\u6570\u7ec4\uff1a<code>[object Array]<\/code><\/li>\n<li>\u2026\u2026\u7b49\uff08\u53ef\u81ea\u5b9a\u4e49\uff09<br \/>\n\u8ba9\u6211\u4eec\u6f14\u793a\u4e00\u4e0b\uff1a<\/li>\n<\/ul>\n<pre><code class=\"language-js\">\/\/ \u65b9\u4fbf\u8d77\u89c1\uff0c\u5c06 toString \u65b9\u6cd5\u590d\u5236\u5230\u4e00\u4e2a\u53d8\u91cf\u4e2d\nlet objectToString = Object.prototype.toString;\n\n\/\/ \u5b83\u662f\u4ec0\u4e48\u7c7b\u578b\u7684\uff1f\nlet arr = [];\n\nalert( objectToString.call(arr) ); \/\/ [object Array]\n<\/code><\/pre>\n<p>\u8fd9\u91cc\u6211\u4eec\u7528\u5230\u4e86\u5728\u00a0<a href=\"https:\/\/zh.javascript.info\/call-apply-decorators\">\u88c5\u9970\u5668\u6a21\u5f0f\u548c\u8f6c\u53d1\uff0ccall\/apply<\/a>\u00a0\u4e00\u7ae0\u4e2d\u8bb2\u8fc7\u7684\u00a0<a href=\"https:\/\/developer.mozilla.org\/zh\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/function\/call\">call<\/a>\u00a0\u65b9\u6cd5\u6765\u5728\u4e0a\u4e0b\u6587\u00a0<code>this=arr<\/code>\u00a0\u4e2d\u6267\u884c\u51fd\u6570\u00a0<code>objectToString<\/code>\u3002<br \/>\n\u5728\u5185\u90e8\uff0c<code>toString<\/code>\u00a0\u7684\u7b97\u6cd5\u4f1a\u68c0\u67e5\u00a0<code>this<\/code>\uff0c\u5e76\u8fd4\u56de\u76f8\u5e94\u7684\u7ed3\u679c\u3002\u518d\u4e3e\u51e0\u4e2a\u4f8b\u5b50\uff1a<\/p>\n<pre><code class=\"language-js\">let s = Object.prototype.toString;\n\nalert( s.call(123) ); \/\/ [object Number]\nalert( s.call(null) ); \/\/ [object Null]\nalert( s.call(alert) ); \/\/ [object Function]\n<\/code><\/pre>\n<h3>Symbol.toStringTag<\/h3>\n<p>\u53ef\u4ee5\u4f7f\u7528\u7279\u6b8a\u7684\u5bf9\u8c61\u5c5e\u6027\u00a0<code>Symbol.toStringTag<\/code>\u00a0\u81ea\u5b9a\u4e49\u5bf9\u8c61\u7684\u00a0<code>toString<\/code>\u00a0\u65b9\u6cd5\u7684\u884c\u4e3a\u3002<br \/>\n\u4f8b\u5982\uff1a<\/p>\n<pre><code class=\"language-js\">let user = {\n  [Symbol.toStringTag]: &quot;User&quot;\n};\n\nalert( {}.toString.call(user) ); \/\/ [object User]\n<\/code><\/pre>\n<p>\u5bf9\u4e8e\u5927\u591a\u6570\u7279\u5b9a\u4e8e\u73af\u5883\u7684\u5bf9\u8c61\uff0c\u90fd\u6709\u4e00\u4e2a\u8fd9\u6837\u7684\u5c5e\u6027\u3002\u4e0b\u9762\u662f\u4e00\u4e9b\u7279\u5b9a\u4e8e\u6d4f\u89c8\u5668\u7684\u793a\u4f8b\uff1a<\/p>\n<pre><code class=\"language-js\">\/\/ \u7279\u5b9a\u4e8e\u73af\u5883\u7684\u5bf9\u8c61\u548c\u7c7b\u7684 toStringTag\uff1a\nalert( window[Symbol.toStringTag]); \/\/ Window\nalert( XMLHttpRequest.prototype[Symbol.toStringTag] ); \/\/ XMLHttpRequest\n\nalert( {}.toString.call(window) ); \/\/ [object Window]\nalert( {}.toString.call(new XMLHttpRequest()) ); \/\/ [object XMLHttpRequest]\n<\/code><\/pre>\n<p>\u6b63\u5982\u6211\u4eec\u6240\u770b\u5230\u7684\uff0c\u8f93\u51fa\u7ed3\u679c\u6070\u597d\u662f\u00a0<code>Symbol.toStringTag<\/code>\uff08\u5982\u679c\u5b58\u5728\uff09\uff0c\u53ea\u4e0d\u8fc7\u88ab\u5305\u88f9\u8fdb\u4e86\u00a0<code>[object ...]<\/code>\u00a0\u91cc\u3002<br \/>\n\u8fd9\u6837\u4e00\u6765\uff0c\u6211\u4eec\u624b\u5934\u4e0a\u5c31\u6709\u4e86\u4e2a\u201c\u78d5\u4e86\u836f\u4f3c\u7684 typeof\u201d\uff0c\u4e0d\u4ec5\u80fd\u68c0\u67e5\u539f\u59cb\u6570\u636e\u7c7b\u578b\uff0c\u800c\u4e14\u9002\u7528\u4e8e\u5185\u5efa\u5bf9\u8c61\uff0c\u66f4\u53ef\u8d35\u7684\u662f\u8fd8\u652f\u6301\u81ea\u5b9a\u4e49\u3002<br \/>\n\u6240\u4ee5\uff0c\u5982\u679c\u6211\u4eec\u60f3\u8981\u83b7\u53d6\u5185\u5efa\u5bf9\u8c61\u7684\u7c7b\u578b\uff0c\u5e76\u5e0c\u671b\u628a\u8be5\u4fe1\u606f\u4ee5\u5b57\u7b26\u4e32\u7684\u5f62\u5f0f\u8fd4\u56de\uff0c\u800c\u4e0d\u53ea\u662f\u68c0\u67e5\u7c7b\u578b\u7684\u8bdd\uff0c\u6211\u4eec\u53ef\u4ee5\u7528\u00a0<code>{}.toString.call<\/code>\u00a0\u66ff\u4ee3\u00a0<code>instanceof<\/code>\u3002<\/p>\n<h1>Mixin \u6a21\u5f0f<\/h1>\n<p>\u5728 JavaScript \u4e2d\uff0c\u6211\u4eec\u53ea\u80fd\u7ee7\u627f\u5355\u4e2a\u5bf9\u8c61\u3002\u6bcf\u4e2a\u5bf9\u8c61\u53ea\u80fd\u6709\u4e00\u4e2a\u00a0<code>[[Prototype]]<\/code>\u3002\u5e76\u4e14\u6bcf\u4e2a\u7c7b\u53ea\u53ef\u4ee5\u6269\u5c55\u53e6\u5916\u4e00\u4e2a\u7c7b\u3002<br \/>\n\u4f46\u662f\u6709\u4e9b\u65f6\u5019\u8fd9\u79cd\u8bbe\u5b9a\uff08\u8bd1\u6ce8\uff1a\u5355\u7ee7\u627f\uff09\u4f1a\u8ba9\u4eba\u611f\u5230\u53d7\u9650\u5236\u3002\u4f8b\u5982\uff0c\u6211\u6709\u4e00\u4e2a\u00a0<code>StreetSweeper<\/code>\u00a0\u7c7b\u548c\u4e00\u4e2a\u00a0<code>Bicycle<\/code>\u00a0\u7c7b\uff0c\u73b0\u5728\u60f3\u8981\u4e00\u4e2a\u5b83\u4eec\u7684 mixin\uff1a<code>StreetSweepingBicycle<\/code>\u00a0\u7c7b\u3002<br \/>\n\u6216\u8005\uff0c\u6211\u4eec\u6709\u4e00\u4e2a\u00a0<code>User<\/code>\u00a0\u7c7b\u548c\u4e00\u4e2a\u00a0<code>EventEmitter<\/code>\u00a0\u7c7b\u6765\u5b9e\u73b0\u4e8b\u4ef6\u751f\u6210\uff08event generation\uff09\uff0c\u5e76\u4e14\u6211\u4eec\u60f3\u5c06\u00a0<code>EventEmitter<\/code>\u00a0\u7684\u529f\u80fd\u6dfb\u52a0\u5230\u00a0<code>User<\/code>\u00a0\u4e2d\uff0c\u4ee5\u4fbf\u6211\u4eec\u7684\u7528\u6237\u53ef\u4ee5\u89e6\u53d1\u4e8b\u4ef6\uff08emit event\uff09\u3002<br \/>\n\u6709\u4e00\u4e2a\u6982\u5ff5\u53ef\u4ee5\u5e2e\u52a9\u6211\u4eec\uff0c\u53eb\u505a \u201cmixins\u201d\u3002<br \/>\n\u6839\u636e\u7ef4\u57fa\u767e\u79d1\u7684\u5b9a\u4e49\uff0c<a href=\"https:\/\/en.wikipedia.org\/wiki\/Mixin\">mixin<\/a>\u00a0\u662f\u4e00\u4e2a\u5305\u542b\u53ef\u88ab\u5176\u4ed6\u7c7b\u4f7f\u7528\u800c\u65e0\u9700\u7ee7\u627f\u7684\u65b9\u6cd5\u7684\u7c7b\u3002<br \/>\n\u6362\u53e5\u8bdd\u8bf4\uff0c<em>mixin<\/em>\u00a0\u63d0\u4f9b\u4e86\u5b9e\u73b0\u7279\u5b9a\u884c\u4e3a\u7684\u65b9\u6cd5\uff0c\u4f46\u662f\u6211\u4eec\u4e0d\u5355\u72ec\u4f7f\u7528\u5b83\uff0c\u800c\u662f\u4f7f\u7528\u5b83\u6765\u5c06\u8fd9\u4e9b\u884c\u4e3a\u6dfb\u52a0\u5230\u5176\u4ed6\u7c7b\u4e2d\u3002<\/p>\n<h2>\u4e00\u4e2aMixin\u5b9e\u4f8b<\/h2>\n<p>\u5728 JavaScript \u4e2d\u6784\u9020\u4e00\u4e2a mixin \u6700\u7b80\u5355\u7684\u65b9\u5f0f\u5c31\u662f\u6784\u9020\u4e00\u4e2a\u62e5\u6709\u5b9e\u7528\u65b9\u6cd5\u7684\u5bf9\u8c61\uff0c\u4ee5\u4fbf\u6211\u4eec\u53ef\u4ee5\u8f7b\u677e\u5730\u5c06\u8fd9\u4e9b\u5b9e\u7528\u7684\u65b9\u6cd5\u5408\u5e76\u5230\u4efb\u4f55\u7c7b\u7684\u539f\u578b\u4e2d\u3002<br \/>\n\u4f8b\u5982\uff0c\u8fd9\u4e2a\u540d\u4e3a\u00a0<code>sayHiMixin<\/code>\u00a0\u7684 mixin \u7528\u4e8e\u7ed9\u00a0<code>User<\/code>\u00a0\u6dfb\u52a0\u4e00\u4e9b\u201c\u8bed\u8a00\u529f\u80fd\u201d\uff1a<\/p>\n<pre><code class=\"language-js\">\/\/ mixin\nlet sayHiMixin = {\n  sayHi() {\n    alert(`Hello ${this.name}`);\n  },\n  sayBye() {\n    alert(`Bye ${this.name}`);\n  }\n};\n\n\/\/ \u7528\u6cd5\uff1a\nclass User {\n  constructor(name) {\n    this.name = name;\n  }\n}\n\n\/\/ \u62f7\u8d1d\u65b9\u6cd5\nObject.assign(User.prototype, sayHiMixin);\n\n\/\/ \u73b0\u5728 User \u53ef\u4ee5\u6253\u62db\u547c\u4e86\nnew User(&quot;Dude&quot;).sayHi(); \/\/ Hello Dude!\n<\/code><\/pre>\n<p>\u8fd9\u91cc\u6ca1\u6709\u7ee7\u627f\uff0c\u53ea\u6709\u4e00\u4e2a\u7b80\u5355\u7684\u65b9\u6cd5\u62f7\u8d1d\u3002\u6240\u4ee5\u00a0<code>User<\/code>\u00a0\u53ef\u4ee5\u4ece\u53e6\u4e00\u4e2a\u7c7b\u7ee7\u627f\uff0c\u8fd8\u53ef\u4ee5\u5305\u62ec mixin \u6765 &quot;mix-in\u201c \u5176\u5b83\u65b9\u6cd5\uff0c\u5c31\u50cf\u8fd9\u6837\uff1a<\/p>\n<pre><code class=\"language-js\">class User extends Person {\n  \/\/ ...\n}\n\nObject.assign(User.prototype, sayHiMixin);\n<\/code><\/pre>\n<p>Mixin \u53ef\u4ee5\u5728\u81ea\u5df1\u5185\u90e8\u4f7f\u7528\u7ee7\u627f\u3002<br \/>\n\u4f8b\u5982\uff0c\u8fd9\u91cc\u7684\u00a0<code>sayHiMixin<\/code>\u00a0\u7ee7\u627f\u81ea\u00a0<code>sayMixin<\/code>\uff1a<\/p>\n<pre><code class=\"language-js\">let sayMixin = {\n  say(phrase) {\n    alert(phrase);\n  }\n};\n\nlet sayHiMixin = {\n  __proto__: sayMixin, \/\/ (\u6216\u8005\uff0c\u6211\u4eec\u53ef\u4ee5\u5728\u8fd9\u513f\u4f7f\u7528 Object.setPrototypeOf \u6765\u8bbe\u7f6e\u539f\u578b)\n\n  sayHi() {\n    \/\/ \u8c03\u7528\u7236\u7c7b\u65b9\u6cd5\n    super.say(`Hello ${this.name}`); \/\/ (*)\n  },\n  sayBye() {\n    super.say(`Bye ${this.name}`); \/\/ (*)\n  }\n};\n\nclass User {\n  constructor(name) {\n    this.name = name;\n  }\n}\n\n\/\/ \u62f7\u8d1d\u65b9\u6cd5\nObject.assign(User.prototype, sayHiMixin);\n\n\/\/ \u73b0\u5728 User \u53ef\u4ee5\u6253\u62db\u547c\u4e86\nnew User(&quot;Dude&quot;).sayHi(); \/\/ Hello Dude!\n<\/code><\/pre>\n<p>\u8bf7\u6ce8\u610f\uff0c\u5728\u00a0<code>sayHiMixin<\/code>\u00a0\u5185\u90e8\u5bf9\u7236\u7c7b\u65b9\u6cd5\u00a0<code>super.say()<\/code>\u00a0\u7684\u8c03\u7528\uff08\u5728\u6807\u6709\u00a0<code>(*)<\/code>\u00a0\u7684\u884c\uff09\u4f1a\u5728 mixin \u7684\u539f\u578b\u4e2d\u67e5\u627e\u65b9\u6cd5\uff0c\u800c\u4e0d\u662f\u5728 class \u4e2d\u67e5\u627e\u3002<br \/>\n\u8fd9\u662f\u793a\u610f\u56fe\uff08\u8bf7\u53c2\u89c1\u56fe\u4e2d\u53f3\u4fa7\u90e8\u5206\uff09\uff1a<br \/>\n<div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/levin.ink\/wp-content\/uploads\/2024\/06\/Pasted-image-20240619155655.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/levin.ink\/wp-content\/uploads\/2024\/06\/Pasted-image-20240619155655.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"Pasted image 20240619155655.png\"><\/div><br \/>\n\u8fd9\u662f\u56e0\u4e3a\u65b9\u6cd5\u00a0<code>sayHi<\/code>\u00a0\u548c\u00a0<code>sayBye<\/code>\u00a0\u6700\u521d\u662f\u5728\u00a0<code>sayHiMixin<\/code>\u00a0\u4e2d\u521b\u5efa\u7684\u3002\u56e0\u6b64\uff0c\u5373\u4f7f\u590d\u5236\u4e86\u5b83\u4eec\uff0c\u4f46\u662f\u5b83\u4eec\u7684\u00a0<code>[[HomeObject]]<\/code>\u00a0\u5185\u90e8\u5c5e\u6027\u4ecd\u5f15\u7528\u7684\u662f\u00a0<code>sayHiMixin<\/code>\uff0c\u5982\u4e0a\u56fe\u6240\u793a\u3002<br \/>\n\u5f53\u00a0<code>super<\/code>\u00a0\u5728\u00a0<code>[[HomeObject]].[[Prototype]]<\/code>\u00a0\u4e2d\u5bfb\u627e\u7236\u65b9\u6cd5\u65f6\uff0c\u610f\u5473\u7740\u5b83\u641c\u7d22\u7684\u662f\u00a0<code>sayHiMixin.[[Prototype]]<\/code>\uff0c\u800c\u4e0d\u662f\u00a0<code>User.[[Prototype]]<\/code>\u3002<\/p>\n<h2>EventMixin<\/h2>\n<p>\u73b0\u5728\u8ba9\u6211\u4eec\u4e3a\u5b9e\u9645\u8fd0\u7528\u6784\u9020\u4e00\u4e2a mixin\u3002<br \/>\n\u4f8b\u5982\uff0c\u8bb8\u591a\u6d4f\u89c8\u5668\u5bf9\u8c61\u7684\u4e00\u4e2a\u91cd\u8981\u529f\u80fd\u662f\u5b83\u4eec\u53ef\u4ee5\u751f\u6210\u4e8b\u4ef6\u3002\u4e8b\u4ef6\u662f\u5411\u4efb\u4f55\u6709\u9700\u8981\u7684\u4eba\u201c\u5e7f\u64ad\u4fe1\u606f\u201d\u7684\u597d\u65b9\u6cd5\u3002\u56e0\u6b64\uff0c\u8ba9\u6211\u4eec\u6784\u9020\u4e00\u4e2a mixin\uff0c\u4f7f\u6211\u4eec\u80fd\u591f\u8f7b\u677e\u5730\u5c06\u4e0e\u4e8b\u4ef6\u76f8\u5173\u7684\u51fd\u6570\u6dfb\u52a0\u5230\u4efb\u610f class\/object \u4e2d\u3002<\/p>\n<ul>\n<li>Mixin \u5c06\u63d0\u4f9b\u00a0<code>.trigger(name, [...data])<\/code>\u00a0\u65b9\u6cd5\uff0c\u4ee5\u5728\u53d1\u751f\u91cd\u8981\u7684\u4e8b\u60c5\u65f6\u201c\u751f\u6210\u4e00\u4e2a\u4e8b\u4ef6\u201d\u3002<code>name<\/code>\u00a0\u53c2\u6570\uff08arguments\uff09\u662f\u4e8b\u4ef6\u7684\u540d\u79f0\uff0c<code>[...data]<\/code>\u00a0\u662f\u53ef\u9009\u7684\u5e26\u6709\u4e8b\u4ef6\u6570\u636e\u7684\u5176\u4ed6\u53c2\u6570\uff08arguments\uff09\u3002<\/li>\n<li>\u6b64\u5916\u8fd8\u6709\u00a0<code>.on(name, handler)<\/code>\u00a0\u65b9\u6cd5\uff0c\u5b83\u4e3a\u5177\u6709\u7ed9\u5b9a\u540d\u79f0\u7684\u4e8b\u4ef6\u6dfb\u52a0\u4e86\u00a0<code>handler<\/code>\u00a0\u51fd\u6570\u4f5c\u4e3a\u76d1\u542c\u5668\uff08listener\uff09\u3002\u5f53\u5177\u6709\u7ed9\u5b9a\u00a0<code>name<\/code>\u00a0\u7684\u4e8b\u4ef6\u89e6\u53d1\u65f6\u5c06\u8c03\u7528\u8be5\u65b9\u6cd5\uff0c\u5e76\u4ece\u00a0<code>.trigger<\/code>\u00a0\u8c03\u7528\u4e2d\u83b7\u53d6\u53c2\u6570\uff08arguments\uff09\u3002<\/li>\n<li>\u2026\u2026\u8fd8\u6709\u00a0<code>.off(name, handler)<\/code>\u00a0\u65b9\u6cd5\uff0c\u5b83\u4f1a\u5220\u9664\u00a0<code>handler<\/code>\u00a0\u76d1\u542c\u5668\uff08listener\uff09\u3002<br \/>\n\u6dfb\u52a0\u5b8c mixin \u540e\uff0c\u5bf9\u8c61\u00a0<code>user<\/code>\u00a0\u5c06\u80fd\u591f\u5728\u8bbf\u5ba2\u767b\u5f55\u65f6\u751f\u6210\u4e8b\u4ef6\u00a0<code>&quot;login&quot;<\/code>\u3002\u53e6\u4e00\u4e2a\u5bf9\u8c61\uff0c\u4f8b\u5982\u00a0<code>calendar<\/code>\u00a0\u53ef\u80fd\u5e0c\u671b\u76d1\u542c\u6b64\u7c7b\u4e8b\u4ef6\u4ee5\u4fbf\u4e3a\u767b\u5f55\u7684\u4eba\u52a0\u8f7d\u65e5\u5386\u3002<br \/>\n\u6216\u8005\uff0c\u5f53\u4e00\u4e2a\u83dc\u5355\u9879\u88ab\u9009\u4e2d\u65f6\uff0c<code>menu<\/code>\u00a0\u53ef\u4ee5\u751f\u6210\u00a0<code>&quot;select&quot;<\/code>\u00a0\u4e8b\u4ef6\uff0c\u5176\u4ed6\u5bf9\u8c61\u53ef\u4ee5\u5206\u914d\u5904\u7406\u7a0b\u5e8f\u4ee5\u5bf9\u8be5\u4e8b\u4ef6\u4f5c\u51fa\u53cd\u5e94\u3002\u8bf8\u5982\u6b64\u7c7b\u3002<\/li>\n<\/ul>\n<pre><code class=\"language-js\">let eventMixin = {\n  \/**\n   * \u8ba2\u9605\u4e8b\u4ef6\uff0c\u7528\u6cd5\uff1a\n   *  menu.on('select', function(item) { ... }\n  *\/\n  on(eventName, handler) {\n    if (!this._eventHandlers) this._eventHandlers = {};\n    if (!this._eventHandlers[eventName]) {\n      this._eventHandlers[eventName] = [];\n    }\n    this._eventHandlers[eventName].push(handler);\n  },\n\n  \/**\n   * \u53d6\u6d88\u8ba2\u9605\uff0c\u7528\u6cd5\uff1a\n   *  menu.off('select', handler)\n   *\/\n  off(eventName, handler) {\n    let handlers = this._eventHandlers?.[eventName];\n    if (!handlers) return;\n    for (let i = 0; i &lt; handlers.length; i++) {\n      if (handlers[i] === handler) {\n        handlers.splice(i--, 1);\n      }\n    }\n  },\n\n  \/**\n   * \u751f\u6210\u5177\u6709\u7ed9\u5b9a\u540d\u79f0\u548c\u6570\u636e\u7684\u4e8b\u4ef6\n   *  this.trigger('select', data1, data2);\n   *\/\n  trigger(eventName, ...args) {\n    if (!this._eventHandlers?.[eventName]) {\n      return; \/\/ \u8be5\u4e8b\u4ef6\u540d\u79f0\u6ca1\u6709\u5bf9\u5e94\u7684\u4e8b\u4ef6\u5904\u7406\u7a0b\u5e8f\uff08handler\uff09\n    }\n\n    \/\/ \u8c03\u7528\u4e8b\u4ef6\u5904\u7406\u7a0b\u5e8f\uff08handler\uff09\n    this._eventHandlers[eventName].forEach(handler =&gt; handler.apply(this, args));\n  }\n};\n<\/code><\/pre>\n<ol>\n<li><code>.on(eventName, handler)<\/code>\u00a0\u2014 \u6307\u5b9a\u51fd\u6570\u00a0<code>handler<\/code>\u00a0\u4ee5\u5728\u5177\u6709\u5bf9\u5e94\u540d\u79f0\u7684\u4e8b\u4ef6\u53d1\u751f\u65f6\u8fd0\u884c\u3002\u4ece\u6280\u672f\u4e0a\u8bb2\uff0c\u8fd9\u513f\u6709\u4e00\u4e2a\u7528\u4e8e\u5b58\u50a8\u6bcf\u4e2a\u4e8b\u4ef6\u540d\u79f0\u5bf9\u5e94\u7684\u5904\u7406\u7a0b\u5e8f\uff08handler\uff09\u7684\u00a0<code>_eventHandlers<\/code>\u00a0\u5c5e\u6027\uff0c\u5728\u8fd9\u513f\u8be5\u5c5e\u6027\u5c31\u4f1a\u5c06\u521a\u521a\u6307\u5b9a\u7684\u8fd9\u4e2a\u00a0<code>handler<\/code>\u00a0\u6dfb\u52a0\u5230\u5217\u8868\u4e2d\u3002<\/li>\n<li><code>.off(eventName, handler)<\/code>\u00a0\u2014 \u4ece\u5904\u7406\u7a0b\u5e8f\u5217\u8868\u4e2d\u5220\u9664\u6307\u5b9a\u7684\u51fd\u6570\u3002<\/li>\n<li><code>.trigger(eventName, ...args)<\/code>\u00a0\u2014 \u751f\u6210\u4e8b\u4ef6\uff1a\u6240\u6709\u00a0<code>_eventHandlers[eventName]<\/code>\u00a0\u4e2d\u7684\u4e8b\u4ef6\u5904\u7406\u7a0b\u5e8f\uff08handler\uff09\u90fd\u88ab\u8c03\u7528\uff0c\u5e76\u4e14\u00a0<code>...args<\/code>\u00a0\u4f1a\u88ab\u4f5c\u4e3a\u53c2\u6570\u4f20\u9012\u7ed9\u5b83\u4eec\u3002<\/li>\n<\/ol>\n<pre><code class=\"language-js\">\/\/ \u521b\u5efa\u4e00\u4e2a class\nclass Menu {\n  choose(value) {\n    this.trigger(&quot;select&quot;, value);\n  }\n}\n\/\/ \u6dfb\u52a0\u5e26\u6709\u4e8b\u4ef6\u76f8\u5173\u65b9\u6cd5\u7684 mixin\nObject.assign(Menu.prototype, eventMixin);\n\nlet menu = new Menu();\n\n\/\/ \u6dfb\u52a0\u4e00\u4e2a\u4e8b\u4ef6\u5904\u7406\u7a0b\u5e8f\uff08handler\uff09\uff0c\u5728\u88ab\u9009\u62e9\u65f6\u88ab\u8c03\u7528\uff1a\nmenu.on(&quot;select&quot;, value =&gt; alert(`Value selected: ${value}`));\n\n\/\/ \u89e6\u53d1\u4e8b\u4ef6 =&gt; \u8fd0\u884c\u4e0a\u8ff0\u7684\u4e8b\u4ef6\u5904\u7406\u7a0b\u5e8f\uff08handler\uff09\u5e76\u663e\u793a\uff1a\n\/\/ \u88ab\u9009\u4e2d\u7684\u503c\uff1a123\nmenu.choose(&quot;123&quot;);\n<\/code><\/pre>\n<p>\u73b0\u5728\uff0c\u5982\u679c\u6211\u4eec\u5e0c\u671b\u4efb\u4f55\u4ee3\u7801\u5bf9\u83dc\u5355\u9009\u62e9\u4f5c\u51fa\u53cd\u5e94\uff0c\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u00a0<code>menu.on(...)<\/code>\u00a0\u8fdb\u884c\u76d1\u542c\u3002<br \/>\n\u4f7f\u7528\u00a0<code>eventMixin<\/code>\u00a0\u53ef\u4ee5\u8f7b\u677e\u5730\u5c06\u6b64\u7c7b\u884c\u4e3a\u6dfb\u52a0\u5230\u6211\u4eec\u60f3\u8981\u7684\u591a\u4e2a\u7c7b\u4e2d\uff0c\u5e76\u4e14\u4e0d\u4f1a\u5f71\u54cd\u7ee7\u627f\u94fe\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Class \u57fa\u672c\u8bed\u6cd5 \u5728\u65e5\u5e38\u5f00\u53d1\u4e2d\uff0c\u6211\u4eec\u7ecf\u5e38\u9700\u8981\u521b\u5efa\u8bb8\u591a\u76f8\u540c\u7c7b\u578b\u7684\u5bf9\u8c61\uff0c\u4f8b\u5982\u7528\u6237\uff08users\uff09\u3001\u5546\u54c1\uff08good [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[19],"tags":[],"class_list":["post-659","post","type-post","status-publish","format-standard","hentry","category-front-end"],"_links":{"self":[{"href":"https:\/\/levin.ink\/index.php?rest_route=\/wp\/v2\/posts\/659","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/levin.ink\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/levin.ink\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/levin.ink\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/levin.ink\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=659"}],"version-history":[{"count":1,"href":"https:\/\/levin.ink\/index.php?rest_route=\/wp\/v2\/posts\/659\/revisions"}],"predecessor-version":[{"id":660,"href":"https:\/\/levin.ink\/index.php?rest_route=\/wp\/v2\/posts\/659\/revisions\/660"}],"wp:attachment":[{"href":"https:\/\/levin.ink\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=659"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/levin.ink\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=659"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/levin.ink\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=659"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}