首頁  >  問答  >  主體

javascript - js protype和_proto_的小疑惑


函數會建立prorotype屬性指向原型物件,那麼prototype 是函數專屬的屬性而chrome中所有物件好像都有_proro_屬性,那麼_proto_是什麼?原型物件的指針嗎?那原型物件中的_proto_嗎?求解惑 謝謝

伊谢尔伦伊谢尔伦2685 天前755

全部回覆(9)我來回復

  • 天蓬老师

    天蓬老师2017-05-19 10:28:34

    _proto_是實例物件上的屬性,就按書中所寫的內容給你看看吧:

        function Person(){
        
        }
        Person.prototype = {
            constructor:Person,
            name : "Nicholas",
            age  : 29,
            sayName(){
                alert(this.name);
            }
        }
        var son = new Person();

    son實例上有_proto_指針,這個指針指向的是它的原型對象,而不是構造函數,因此才會有原型鏈搜尋的過程,所有實例可以透過原型鏈找到原型上的方法屬性,並且共享。而這條原型鏈的頂端就是Object,當搜尋實例上的屬性、f方法時,搜尋的順序是這樣的:實例==>建構子==>原型物件==>Object。

    關於末端是不是Object,還有一種特例,ES5中新加入的Object.create()方法可以改變它,暫時不考慮這個因素,絕大多數情況下末端就是Object,所以實例可以使用Object上toString( )、valueOf()、hasOwnProperty()等方法。

    解釋的不好,希望對你有幫助!這一部分多看書上的內容,結合書中的代碼多實踐就能思考出來,建議參考《高程3版》的第六章所有內容。

    回覆
    0
  • 给我你的怀抱

    给我你的怀抱2017-05-19 10:28:34

    請參考《JavaScript高級程式設計》第六章

    回覆
    0
  • 怪我咯

    怪我咯2017-05-19 10:28:34

    __proto__就是一個物件的屬性,可以透過他去存取原型物件的屬性。過程是這樣的,當我們使用new操作符後實例化一個對象,例如

    function People(name) {
        this.name = name;
        this.speak = function(){
            alert(this.name);
        };
    }
    People.prototype.run = function(){
        alert('速度挺快');
    };
    var person = new People('jack');
    当调用person.speak()时,这个时候系统扫描了一下person 本身的属性和方法,发现自己有就调用了。
    如果调用的是person.run(),显然这个对象是没有这个方法的,
    这个方法是在原型对象的,所以在他要去到原型中找。
    当前对象是怎么和原型对象联系起来的呢
    就是通过__proto__
    既然所有的对象都有__proto__属性
    原型对象也是对象同样也有__proto__属性
    ,这样就形成了原型链,也就是继承。
    一级一级的查找你调用的方法和属性,找到后立即返回。
    这个点有点难理解,可以和你共同探讨。
    

    回覆
    0
  • 给我你的怀抱

    给我你的怀抱2017-05-19 10:28:34

    __proto__是對象的屬性,
    prototype是函數的屬性,
    函數也是對象,也有__proto__

    回覆
    0
  • 曾经蜡笔没有小新

    曾经蜡笔没有小新2017-05-19 10:28:34

    感覺上面的沒答道點子上,__proto__是一條線,這根線的目的地就是Prototype對象(原型對象),__proto__用來連接對象與它的原型

    回覆
    0
  • 仅有的幸福

    仅有的幸福2017-05-19 10:28:34

    首先修正題主的描述的錯誤:prototype並不是函數特有的屬性。
    如果真的想了解這方面的問題,請研究js的原型链相關知識。
    如上面朋友所說,請參考《JavaScript高級程式設計》第六章,有個基本了解之後再來看這張圖會更加清晰。

    回覆
    0
  • 给我你的怀抱

    给我你的怀抱2017-05-19 10:28:34

    大概可以這樣想比較好理解但是可能不夠深入但是這是最好的理解方式你可以把函數那些不想暴露給你的方法和屬性想成存儲在Prototype對象裡的數據函數就好比一個種族有的種族非常強大有潛在的力量好比賽亞人吧很多東西你不能直接看到只能透過某些方式把他逼出來ok 那麼__proto__就可以做到利用他你就明白了哦原來我可以毀滅地球啊哈哈哈哈

    回覆
    0
  • 巴扎黑

    巴扎黑2017-05-19 10:28:34

    @臨水照花
    如圖,這表示Object和Function都是頂層物件嗎?

    回覆
    0
  • 滿天的星座

    滿天的星座2017-05-19 10:28:34

    謝謝大家的回答,看了下高程三,函數會創建prorotype屬性指向原型對象,prototype確實是函數獨有屬性,實例內部會有一個指向原型對象的指針[[prototype]],在firefox chrome safari 每個物件都支援_proto_屬性,這應該是[[prototype]]的瀏覽器實作.

    每個建構函式都有一個原型物件,原型物件都包含一個指向建構函式的指標,實例物件都包含一個指向原型物件的內部指標,原型與實例的關係形成原型鏈。繼承主要依靠原型鏈實作,讓原型物件等於另一個類型的實例,原型物件將包含指向指向另一個原型的指針,另一個原型包含指向建構函式的指標層層遞進,所有函式預設原型都是object的實例,會指向obj.prototype,終於明白為什麼所有值都能用Object.prototype.toString.call(value) 判斷型別。

    建構子 <-------- 原型物件 < -------- 實例指標

    "看來多讀書多看報少吃零食多睡覺還是有道理的"
    "你有女朋友嗎?"
    " new GirlFriend"
    "..."

    回覆
    0
  • 取消回覆