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.prototype与new 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对象。
推荐文章
-
冴羽大佬的JavaScript深入之从原型到原型链 (建议看一遍)
-
前端面试题第一题JavaScript中的原型,原型链分别是什么?
简单聊下原型链的面试版:
先说下三个属性的概念及三者之间的关系,再适当举个例子说下原型链 可以这样简略回答:
__proto__是对象原型,指向构造函数的prototype;prototype是构造函数的一个属性,指向原型对象,即访问到原型对象;constructor是原型对象上的属性,指向构造函数,即能访问到构造函数。(三者间的关系)- 例如: 一个数组的
__proto__指向 Array 的 prototype,Array 的prototype的__proto__指向 Object 的 prototype,而Object的 prototype 的__proto__指向null;其中一开始的数字实例是构造函数创建的,prototype 的 constructor 属性能访问到这个构造函数;
图解: