第一题:
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…
由于文章没有解释面试题目答案,所以自己整理总结了一份。