1. 程式人生 > 其它 >js高階_原型鏈

js高階_原型鏈

1. 原型鏈(圖解)

*訪問一個物件的屬性時,

*先在自身屬性中查詢,找到返回

*如果沒有, 再沿著 _proto__這條鏈向上查詢, 找到則返回

*如果最終沒找到, 返回undefined

*別名: 隱式原型鏈

*作用: 查詢物件的屬性(方法)

2. 建構函式/原型/實體物件的關係(圖解)

一來系統就會建立Object函式物件即Function Object()
var o1=new Object();//有括號的就是函式型別
var o2={}

3. 建構函式/原型/實體物件的關係2(圖解)

*所有的自己建立的函式物件的顯示原型屬性都是一個空的Object物件(也就是new Object()的例項)

所有的函式都是Function的例項,所以所有的函式的隱式屬性都相等,因為它們都是Function函式的例項,即所有函式的_proto,都指向Function函式物件的原型物件,(Function=new Function()的操作意義,就是為了讓自己成為自己的例項,這樣它的_ proto 隱式屬性就等於Function函式物件的prototype顯示屬性),console.log(Function.prototype===Function.proto);//true()

程式執行流程

一來系統會建立new Function()函式物件,然後執行Function=new Function();

然後建立Object函式物件即Function Object(),以便於以後給建立函式時建立一個空Object函式物件的例項,注意,這裡用的都是函式自己的隱式屬性_proto 操作的,而不是函式的例項物件的隱式屬性_proto,所以我們定義的函式本身就有隱式屬性,就是因為函式物件本身也是Function函式物件的例項,所以我們定義的函式的例項物件實際上就是函式物件例項物件的例項物件。
比如:function Foo(){}
等同於:var Foo=new Function()

總結

function Fun(){
                this.test1=function(){
                    console.log('hello');
                }
            }
            Fun.prototype.test2=function(){
                console.log('hello2');
            }
            var fun=new Fun();
            //1,函式的顯示原型屬性指向的物件預設是空Object例項物件(但Object自身不滿足,它的顯示原型屬性直接指向原型鏈盡頭)
            //console.log(Fun.prototype instanceof Object);//true
            //console.log(Object.prototype instanceof Object)//false
            //console.log(Function.prototype instanceof Object)//true
            //2,所有函式都是Function函式物件的例項(包括Function函式物件本身)
            //console.log(Fun.__proto__===Function.prototype);//true
            //console.log(Function.__proto__===Function.prototype);//true
            //3,Object函式物件的原型物件是原型鏈盡頭
            console.log(Object.prototype.__proto__)//null
            //4,Object函式物件的例項物件的原型物件就是原型鏈盡頭
            var a={}
            console.log(a.__proto__)
            console.log(Object.prototype)
①函式的顯示原型屬性指向的物件預設是空Object例項物件(但Object自身不滿足,它的顯示原型屬性直接指向原型鏈盡頭)
②所有函式都是Function函式物件的例項(包括Function函式物件本身)
③Object函式物件的原型物件是原型鏈盡頭
④Object函式物件的例項物件的原型物件就是原型鏈盡頭,因為通過是通過new Object()建立的例項,本身自己就是一個空物件,不需要再為它向建構函式的例項物件那樣建立一個Object的空物件例項。

console.log(Fun.prototype)
var a={}
console.log(a.proto)
console.log(Object.prototype)

拓展

var o1=new Object();//有括號的就是函式型別
var o2={}
function Foo(){}//等同於:var Foo=new Function()