Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

原型链 #1

Open
kangkang123269 opened this issue Feb 26, 2023 · 1 comment
Open

原型链 #1

kangkang123269 opened this issue Feb 26, 2023 · 1 comment
Labels
JavaScript JavaScript基础

Comments

@kangkang123269
Copy link
Owner

kangkang123269 commented Feb 26, 2023

1. 什么是原型链?(重点)

原型链是JavaScript中一种对象之间继承关系的实现方式。每个对象都有一个指向其原型对象的内部链接,当在对象上访问一个属性时,如果该属性不存在,则会沿着原型链向上查找,直到找到该属性或到达原型链的顶端为止(这里顶端是到null)。

  • constructor、__proto__和prototype三者之间的关系(重点)

    • prototype是什么?

      prototype是函数对象的一个特殊属性,它是一个对象,包含应该由该函数的实例共享的属性和方法。在函数被创建时,JavaScript引擎自动为其创建一个prototype对象。

    • __proto__ 是什么?

      __proto__ 是一个非标准的属性,它是每个 JavaScript 对象都有的一个内部链接,它指向该对象的原型对象。当你访问一个对象的属性时,如果该对象本身没有这个属性,JavaScript 引擎会自动沿着 __proto__ 链向上查找直到找到该属性或者到达原型链顶部为止。

    • constructor是什么?

      constructor是prototype对象的一个特殊属性,它指向该prototype对象所属的函数。例如,如果Foo是一个函数,那么Foo.prototype.constructor将指向Foo本身。

    • __proto__ 和 prototype 有什么关系?

      在 JavaScript 中,__proto__ 和 prototype 是紧密相关的概念。对于任何一个函数对象 foo,它的 prototype 属性指向的对象,就是它创建的实例的原型对象,也就是说,foo.prototype 与 new foo() 所创建的实例的 __proto__ 属性指向同一个对象。

      同时,每个 JavaScript 对象都有一个 __proto__ 属性,它指向该对象的原型对象。对于任何一个构造函数 Foo 的实例 f,f.__proto__ 和 Foo.prototype 指向的都是同一个对象,即 Foo 的原型对象。在 JavaScript 中,__proto__prototype 是紧密相关的概念。对于任何一个函数对象 foo,它的 prototype 属性指向的对象,就是它创建的实例的原型对象,也就是说,foo.prototypenew foo() 所创建的实例的 __proto__ 属性指向同一个对象。

      同时,每个 JavaScript 对象都有一个__proto__属性,它指向该对象的原型对象。对于任何一个构造函数 Foo 的实例 f,f.__proto__ Foo.prototype 指向的都是同一个对象,即 Foo 的原型对象。

    • constructor和prototype之间的关系是什么?(这是一个经常被忽略的问题)

      constructor和prototype属性是相互关联的。prototype属性是函数对象的一个特殊属性,它指向一个对象,而该对象具有一个constructor属性,该属性指向函数本身。因此,通过构造函数的prototype属性可以访问构造函数本身,而通过构造函数的constructor属性可以访问其prototype对象。

2. 原型链是如何实现继承的?

原型链通过让一个对象继承另一个对象的属性和方法来实现继承。一个对象的原型对象可以是另一个对象,这意味着它可以访问原型对象中的属性和方法。如果在对象自身找不到一个属性或方法,它会沿着原型链向上查找,直到找到一个匹配的属性或方法或到达原型链的顶端为止。

3. 如何创建一个对象的原型?

JavaScript中的每个对象都有一个原型对象。可以使用Object.create()方法来创建一个具有特定原型的新对象。例如,可以使用以下代码创建一个具有特定原型的新对象:

var obj = Object.create(proto);

其中proto是新对象的原型对象。

4. JavaScript中的所有对象都有原型吗?

所有JavaScript对象都有原型,除了null。null是一个没有原型的特殊值。

5. JavaScript中的函数对象是什么样的?

JavaScript中的函数对象也是对象,并且具有原型对象。函数对象的原型对象包含Function对象的所有属性和方法,例如call()和apply()。此外,函数对象的原型对象也是Object对象的一个实例,因此它还包含Object对象的所有属性和方法。这使得函数对象能够在原型链中继承自Object对象和Function对象。

推荐文章

  1. 冴羽大佬的JavaScript深入之从原型到原型链 (建议看一遍)

  2. 前端面试题第一题JavaScript中的原型,原型链分别是什么?

题目总结:

image

@kangkang123269
Copy link
Owner Author

kangkang123269 commented Feb 26, 2023

简单聊下原型链的面试版

先说下三个属性的概念及三者之间的关系,再适当举个例子说下原型链
可以这样简略回答:

  1. __proto__是对象原型,指向构造函数的prototype;prototype是构造函数的一个属性,指向原型对象,即访问到原型对象;constructor是原型对象上的属性,指向构造函数,即能访问到构造函数。(三者间的关系)
  2. 例如: 一个数组的__proto__指向 Array 的 prototype,Array 的prototype的__proto__指向 Object 的 prototype,而Object的 prototype 的__proto__指向null;其中一开始的数字实例是构造函数创建的,prototype 的 constructor 属性能访问到这个构造函数;

@kangkang123269 kangkang123269 added the JavaScript JavaScript基础 label Sep 7, 2023
@kangkang123269 kangkang123269 changed the title js1. 原型链 原型链 Sep 7, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
JavaScript JavaScript基础
Projects
None yet
Development

No branches or pull requests

1 participant