有关原型与原型链的面试题

548 阅读1分钟

第一题:

var A = function() {};
A.prototype.n = 1;
var b = new A();

A.prototype = {
  n: 2,
  m: 3
}
var c = new A()

console.log(b.n)
console.log(b.m)

console.log(c.n)
console.log(c.m)

答案:
b.n   //1
b.m   // undefined

c.n   //2
c.m   //3

解析:

A是一个构造函数,A在原型属性上加了一个属性n,此时实例化一个b,b就是构造函数A的实例,所以b._proto_ = A.prototype,所以b.n = 1

接下来,A.protptype被重新赋值,指向了另外一个引用地址。但是b._proto_还是指向A.prototype之前的引用地址,所以b.m是undefined。

c也是A的实例,c是A.prototype被重新赋值之后实例化的,所以c._proto_指向A.prototype被赋值之后的引用地址。

第二题:

function Person(name){
   this.name = name
}

let person = new Person('ad')

person.__proto__ === Person.prototype

Person.__proto__  === Function.prototype

第三题:

var F = function(){}

Object.prototype.a = function(){
   console.log('a');
}

Function.prototype.b = function(){
  console.log('b')
}

var f = new F()
f.a()
f.b()

F.a()
F.b()
答案:
f.a()   // a
f.b()   //f.b is not a function

F.a()  // a
F.b()  // b

解析:

 f 是F的实例, 所以:f.__proto__ === F.prototype

由于F.prototype.__proto__ === Object.prototype

所以f.__proto__.__proto__ ===Object.prototype

所以f.a() 打印执行出‘a’。

F是Function的实例 所以:F.__proto__ === Function.prototype

又由于F.prototype.__proto__ === Object.prototype

所以 F.a()和F.b()都可以执行。

关于原型可以这样总结一下:

var 对象 = new 函数()
对象.__proto__ === 函数.prototype

原型链就是.__proto__的一层又一层的往下指向。

以上题目来自:juejin.cn/post/684490…

由于文章没有解释面试题目答案,所以自己整理总结了一份。