一道关于instance、prototype相关的前端面试题

今天突然看到一道题,

var A = function() {};
A.prototype = {};// 这里的空对象为对象1

var a = new A();
A.prototype = {};// 这里的空对象为对象2
var b = new A();

console.log(a instanceof A);//false
console.log(b instanceof A);//true

看到答案的时候很是不解,查看了instance的原理之后,https://www.ibm.com/developerworks/cn/web/1306_jiangjj_jsinstanceof/,稍微有点豁然开朗

 

instance 代码工作原理,结合下面的函数,可以得出上面代码的结论

function instance_of(L, R) {//L 表示左表达式,R 表示右表达式
 var O = R.prototype;// 取 R 的显示原型
 L = L.__proto__;// 取 L 的隐式原型
 while (true) { 
   if (L === null) 
     return false; 
   if (O === L)// 这里重点:当 O 严格等于 L 时,返回 true 
     return true; 
   L = L.__proto__; 
 } 
}
 

代码稍微修改一下得

var A = function() {}
A.prototype = {first:'first'}
var a = new A()
A.prototype = {second:"second"} // 
var b = new A()
console.log(a instanceof A)// false
console.log(b instanceof A)// true
console.log(A.prototype) // {second:"second"}
console.log(a.__proto__) // {first:'first'}
console.log(b.__proto__) // {second:"second"}

// instanceof 比较左边值的__proto__ 和右边值的prototype 是否相等
// 经过上面实战得出 b.__proto__  === A.prototype  ,所以b instanceof A 为true

 

 

你可能感兴趣的:(一道关于instance、prototype相关的前端面试题)