<script type="text/javascript">
//自定義一個構(gòu)造函數(shù)
function Fun(){}
//利用上面的構(gòu)造函數(shù)構(gòu)造一個實例
var fun1 = new Fun()
console.log(fun1 instanceof Fun) //true
console.log(fun1 instanceof Function) //false
console.log(fun1 instanceof Object) //true
</script>
Instanceof
運算符的前面的凡橱,暫時稱為A规阀;后面一般是一個函數(shù)挣跋,暫時稱為B萍诱。
Instanceof
的判斷規(guī)則是:沿著A的__proto__
這條線來找悬嗓,同時沿著B的prototype
這條線來找,如果能找到同一個引用裕坊,返回true
烫扼,否則返回false
。
那我們來按照這個規(guī)則一個一個來驗證上面的結(jié)果:
注意:每個函數(shù)都有一個prototype
屬性(原型)碍庵,是一個對象映企,每個對象都有一個__proto__
(隱式原型),指向它的構(gòu)造函數(shù)的 prototype(原型)
(也是一個對象)静浴,對象沒有prototype
- 1堰氓、
fun1 instanceof Fun
第一步: fun1.__proto__=Fun.prototype={Fun的原型}
第二步: {原型}.__proto__=Object.prototype={Object的原型}
Object
就是祖先了,萬物皆對象就是這意思苹享,所以它沒有構(gòu)造函數(shù)了双絮,所以也就沒{Object的原型}.__proto__
了,結(jié)束
思如果再{Object的原型}.__proto__
會得到null
,可以再控制臺的console
面板試試
第一步: Fun.prototype={Fun的原型}
{Funde原型}
是一個對象得问,對象沒有prototype
囤攀,結(jié)束
從上可以看出,在第一步A和B就找到同一個引用宫纬,所以返回true
注意:因為prototype
是一個對象焚挠,所以它的__proro__
就是Object.prototype
- 2、
fun1 instanceof Function
第一步: fun1.__proto__=Fun.prototype={Fun的原型}
第二步: {Fun的原型}.__proto__=Object.prototype={Object的原型}
Object
就是祖先了漓骚,所以它沒有構(gòu)造函數(shù)了蝌衔,所以也就沒{Object的原型}.__proto__
了,結(jié)束
第一步: Function.prototype={Function的原型}
{Function的原型}
是一個對象蝌蹂,沒有prototype
,結(jié)束
可以看出fun1和Fun始終沒有找到同一個引用
- 3噩斟、
fun1 instanceof Object
第一步: fun1.__proto__=Fun.prototype={Fun的原型}
第二步: {Fun的原型}.__proto__=Object.prototype={Object的原型}
Object
就是祖先了,所以它沒有構(gòu)造函數(shù)了孤个,所以也就沒{Object的原型}.__proto__
了剃允,結(jié)束
第一步: Object.prototype={Object的原型}
{Object的原型}
是一個對象,沒有prototype
,結(jié)束
從上可以看出,fun1和Object最后找到了同一個引用