javascript繼承問題
迷茫
迷茫 2017-07-05 10:47:40
0
3
696

程式碼如下:

        function Father(){
            this.name = true;
            this.array = [];
        }
        Father.prototype.getFatherValue = function(){
            return this.property;
        }
        function Son(){
            this.sonProperty = false;
        }
        //继承 Father
        Son.prototype = new Father();
        var son1 = new Son();
        var son2 = new Son();

其中Father的array屬性會被son1和son2共用,但是name屬性不會被共用,我的理解是,son1和son2都會去Son.prototype找name屬性,name屬性應該也是被共用的呀,為什麼不是呢?

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回覆(3)
为情所困

因為數組是引用型,對於father(new Father()),son1,son2,這三個實例來說,他們array保存的都是[]這個數組的引用,所以只要其中一個修改了,順著引用找到記憶體中的陣列就會修改,修改的就是同一個陣列。而name = true,這個name是基本型,在分別new實例的時候,會在記憶體中各開闢一個區域內存放它的值,因此上述三個實例的name對應的是不同記憶體區域的值,所以修改了就不會互相影響。
看來樓上的一些回答後,思考了一下,發現我的理解,我的答案是有錯的。保留原答案,下面更正一下。
關於數組那一塊沒有問題,問題在name這個屬性,對於son1,son2來說,他們是沒有name這個屬性的,所以在new的時候,應該是沒有為他們的name開闢記憶體空間的。只有father這個實例有。
son1,son2name值是通過原型鏈查找找到的,如果對son1.name進行賦值,那麼相當於給son1這個實例添加了name屬性,當然再次打印son1.name時取到的值是屬於son1的name值,而印出son2.name,則會去原型鏈上找name,這個時候找到的是Fathername值,因此兩個值不同,可能會造成你沒有共用的錯覺。
值得注意的是,如果son1.array[0] = 1這麼賦值的話,那麼對三個實例的array都會有影響,如果是son1.array = [1],這麼賦值就不會,因為這時候array保留的是對[1]這個新數組記憶體位址的引用。

学霸
son1.array.push(1)
son1.array // [1]
son2.array // [2]

son1.array = [2]
son1.array // [2]
son2.array // [1]

你說array是共用的?

小葫芦

為什麼說 name 屬性不會被共用呢?

原型鏈繼承,就是順著原型鏈一直找,直到找到後回傳此值,如果找不到,回傳 undefined

如果我們給 Son 賦值

son1.name = 'aa';
son2.name = 'bbb';

此時就是取實例的值。只有在 Son 沒有對應的屬性時,才去原型鏈找。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!