JavaScript原型学习笔记
一、理解误区
关于 instanceof理解误区
1.之前一直以为instanceof是用来判断一个对象是否某个函数以构造函数调用实例化出来的实例
//导致产生理解误区的mode
function F1(){};
let f1=new F1();
console.log(f1 instanceof F1);//true
关于isPrototypeOf理解误区
1.之前一直以为isPrototypeOf是用来判断一个对象是否为另一个实例对象通过原型链指向上一层的对象
//导致产生理解误区的mode
function F1(){};
let f1=new F1();
console.log(F1.prototype.isPrototypeOf(f1));//true
二、重新理解后
重新理解instanceof后
1.instanceof 只认用于构造函数调用的函数的prototype的指向,如果函数的prototype是实例对象通过原型链往上查找的任意一层原型,就相等,
2.所以无法用 instanceof 判断某个对象是否为某个函数通过构造函数调用后实例化出来的对象,
3.只能用于判断,某个函数的prototype是否是于某个对象通过[[prototype]]链往上查找的某一层原型,如果是这个[[prototype]]链的某一层,便返回true
//推翻我理解误区的demo
let proObj = {};
function Fn1() {}
Fn1.prototype=proObj
function Fn2() {}
Fn2.prototype=proObj
let fn1=new Fn1();
console.log(fn1 instanceof Fn2);//true
重新理解isPrototypeOf后
1.isPrototypeOf无法用于判断一个对象是否为另一个对象通过[[prototype]]链往上查找的上一层对象;
2.F1.prototype明显不是f3通过[[prototype]]链查找的上一层对象,但是返回true,所以isPrototypeOf的判断可能仅为一个函数的prototype是否为某个对象通过[[prototype]]链往上查找的某一层对象,仅此而已
3.instanceof 也是类似的功能,查找的不仅仅是通过[[prototype]]链往上查找的上一层而已,是某一层
//推翻我理解误区的demo
function F1() {}
function F2() {}
F2.prototype=new F1();
function F3() {}
F3.prototype=new F2();
let f3=new F3();
console.log(F1.prototype.isPrototypeOf(f3));//true
console.log(f3 instanceof F1);//true