前端面试题 - 说一下原型和原型链?

前端面试题 - 说一下原型和原型链?

JavaScript 中,万物皆对象,对象分为普通对象和函数对象。 所有的函数都是函数对象(typeof f === 'function'),其他都是普通对象(typeof o === 'object')。

JS在没有类class前,创建一个对象都是通过 new 函数() 来实现的(也就是构造函数),例如:

var a = new Object() // 此时a是{}
var a = {} // 等价于 var a = new Object()
function b() {}
var a = new b() // 此时a是{}

在 JavaScript 中,每当定义一个对象(函数也是对象)时候,对象中都会包含一些预定义的属性。 其中每个函数对象都有一个prototype 属性,这个属性就是所谓的原型对象。 可以把原型对象是函数内维护的一个对象模版,当 new 函数() ,就会把这个对象拷贝一份返回新对象,这样就完成了对象初始化,例如:

function b() {
    b.prototype.c = 1
    this.d = '2' // 在构造函数里,this指向b.prototype
}
var a = new b() // 此时a为{c: 1, d: '2'}

另外,JS 在创建对象(不论是普通对象还是函数对象)的时候,都有一个叫做__proto__的内置预定义属性, 用于指向创建它的构造函数的原型对象,例如在上面👆的例子中,a.__proto__ === b.prototype

每个对象都有__proto__属性,但只有函数对象才有 prototype 属性。

每个对象都有constructor(构造函数)属性,这个属性指向 prototype 属性所在的函数, 例如在上面👆的例子中,a.constructor === b.prototype.constructor === b

注意Function.prototype是函数对象,但没有prototype属性,即Function.prototype.prototype === undefined,算是一个偏门知识点吧。

原型链:在多重继承中,一个对象可以是原型的拷贝,同时也是另一个对象的原型。 因此,当你尝试访问对象上的属性时,JavaScript引擎开始从对象自身中查找该属性, 如果没有,它会继续检查__proto__,一直到没有__proto__或者找到该属性。 如果找到最后,此属性不存在时,返回undefined。

原型链的最上层是Object.prototype

通俗易懂的前端面试题网站: https://www.front-interview.com

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章