1. 程式人生 > 其它 >搞懂JS中prototype!

搞懂JS中prototype!

1.先說結論:prototype屬性的作用就是讓該函式所例項化的物件們都可以找到公用的屬性和方法。

2.原因:只要建立了一個新函式,就會根據一組特定的規則為該函式建立一個prototype屬性,預設情況下prototype屬性會預設獲得一個constructor(建構函式)屬性。

    

    例項化的物件內部將包含一個內部指標(很多瀏覽器這個指標名字為__proto__)指向建構函式的prototype。即修改函式的prototype屬性,所有該函式例項化的物件的共同屬性和方法都發生了改變。

    

3.示例:對函式的prototype屬性進行操作,可見例項化的物件prototype內屬性、方法是能夠共享,驗證所有該函式例項化的物件的共同屬性和方法都發生了改變。

            function Person(name){
                this.name=name;
            }

            Person.prototype.share=[];

            Person.prototype.printName=function(){
                alert(this.name);
            }

            var person1=new Person('Byron');
            var person2=new Person('Frank');

            person1.share.push(
1); person2.share.push(2); console.log(person2.share); //[1,2]

4.prototype注意點:

  4.1屬性名的查詢規則:當代碼讀取某個物件的某個屬性的時候,都會執行一遍搜尋,目標是具有給定名字的屬性,搜尋首先從物件例項開始,如果在例項中找到該屬性則返回,
              如果沒有則查詢prototype,如果還是沒有找到則繼續遞迴prototype的prototype物件,直到找到為止,如果遞迴到object仍然沒有則返回錯誤。

  4.2根據查詢規則可得,如果在例項中定義如prototype同名的屬性或函式,則會覆蓋prototype的屬性或函式。

function Person(name){
                this.name=name;
            }

            Person.prototype.share=[];
            var person=new Person('Byron');
            person.share=0;

            console.log(person.share); //0而不是prototype中的[]