[問題] this跟prototype的問題

看板Ajax作者 (忍者龜頭痛)時間8年前 (2016/04/07 00:44), 8年前編輯推噓12(12028)
留言40則, 5人參與, 最新討論串1/1
小弟最近在自學js 之前有學過java(oop觀念應該還算可以) 花了好幾天才「好像」懂javascript的this跟prototype 想說用文字把想法寫下來 結果卡住了T_T 看來我還是不懂 上來請教各位 http://imgur.com/ylBcdX6
想問不知道我這樣對於prototype繼承的想法有錯嗎? 還有就是最後的this.... funcB.call(funcC.prototype) 所以this不是應該要是指向funcC.prototype嗎? 實際把funcC.prototype.var2跟var3 印出來確實是10,100 那為什麼temp.var2, temp.var3 甚至temp.var1 也都可以印出值呢? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.255.233.112 ※ 文章網址: https://www.ptt.cc/bbs/Ajax/M.1459961075.A.1D5.html

04/07 00:52, , 1F
(3) <- 怪怪的,要先弄清楚 call 和 apply 的意思
04/07 00:52, 1F
大大你的意思是說這邊不會是call這個方法嗎? 我是看這邊看到的http://www.codedata.com.tw/javascript/essential-javascript-15-prototype/ 喔乾我現在才發現他是說模擬 所以根本就不會是呼叫call嗎lol....

04/07 00:54, , 2F
function 的 prototype 不是在 new 的時候建立的
04/07 00:54, 2F

04/07 00:55, , 3F
而是在你定義 funcB.prototype = new funcA(); 時建立
04/07 00:55, 3F

04/07 00:59, , 4F
new 是建立一個空物件,並且將建構式中的 this 指向這
04/07 00:59, 4F

04/07 01:02, , 5F
個空物件。所以建構式中定義的 this.var2 等都會賦予空
04/07 01:02, 5F

04/07 01:04, , 6F
物件。建構式的 prototype 的 reference 複製給這個空
04/07 01:04, 6F

04/07 01:05, , 7F
物件的 __proto__ 屬性,所以物件可以找到原型物件
04/07 01:05, 7F

04/07 01:06, , 8F
最後變數 temp 會指向這個已經不空的新物件
04/07 01:06, 8F

04/07 01:08, , 9F
當取用物件屬性時,會先從物件本身中尋找
04/07 01:08, 9F

04/07 01:09, , 10F
如果找得到就直接使用,找不到則往上層原型物件去找
04/07 01:09, 10F

04/07 01:11, , 11F
在你的例子裡,temp 沒有 var2,所以往上層原型去找
04/07 01:11, 11F

04/07 01:14, , 12F
上一層的原型物件 funcC.prototype 有 var2 = 10;
04/07 01:14, 12F

04/07 01:15, , 13F
所以就不再繼續往上一層找了
04/07 01:15, 13F

04/07 01:16, , 14F
最好把 this 的觀念整理好才不會很混亂
04/07 01:16, 14F

04/07 01:23, , 15F
看到你有 Java 的底子,練 JS 的時把 Java 暫放一邊 XD
04/07 01:23, 15F
※ 編輯: aa06697 (111.255.233.112), 04/07/2016 01:30:58

04/07 01:35, , 16F
對呀,那篇文章是手動建立空物件、指向原型,再用 call
04/07 01:35, 16F

04/07 01:36, , 17F
來將 function 中的 this 指向 p
04/07 01:36, 17F

04/07 01:37, , 18F
這些動作就是在模擬 new 做的事呀
04/07 01:37, 18F
我好像懂了什麼@@ 謝謝你 我再來研究研究 ※ 編輯: aa06697 (111.255.233.112), 04/07/2016 01:41:41 弱弱的問一下 __proto__是都會指到最頂層嗎? 像是我把funcC.prototype.__proto__ 跟 funcC.prototype.constructor 印出來都是 func A 而不是funcB 而且是funcA { var1=0 } 可是印出temp.__proto__ 卻是funcA 裡面是var2, var3, var6 @@ ※ 編輯: aa06697 (111.255.233.112), 04/07/2016 02:49:55 ※ 編輯: aa06697 (111.255.233.112), 04/07/2016 02:52:26

04/07 03:43, , 19F
你用 new funcA 把 funcB 的 prototype 給取代掉了
04/07 03:43, 19F

04/07 03:44, , 20F
funcB.prototype.constructor 自然就是 funcA
04/07 03:44, 20F

04/07 03:44, , 21F
funcC 同理
04/07 03:44, 21F

04/07 07:14, , 22F
同樓上,因為 funcC.prototype 是 new 出
04/07 07:14, 22F

04/07 07:14, , 23F
來的新物件,所以沒有 constructor 屬性
04/07 07:14, 23F

04/07 07:14, , 24F
,所以會往上層找,變成指向 funcA,因此
04/07 07:14, 24F

04/07 07:14, , 25F
我們要在 funcC.prototype 加上 construc
04/07 07:14, 25F

04/07 07:14, , 26F
tor 指向funcC,funcB.prototype 也是一
04/07 07:14, 26F

04/07 07:14, , 27F
樣的道理
04/07 07:14, 27F

04/07 07:19, , 28F
要記住,物件中如果找不到某一屬性,會「
04/07 07:19, 28F

04/07 07:19, , 29F
一層一層」往原型去找
04/07 07:19, 29F

04/07 07:39, , 30F
__proto__ 只會指向上一層,以此類推
04/07 07:39, 30F

04/07 09:45, , 31F
建議先找本Javascript基本觀念的書看一看通盤瞭解
04/07 09:45, 31F

04/07 09:45, , 32F
像JavaScript優良部份
04/07 09:45, 32F

04/07 09:45, , 33F
有些東西越靠自己試只會越糊塗 XD
04/07 09:45, 33F
感謝以上的各位~ 自己都是看網路上的資源而已 目前也有打算要買書 各位有推薦不錯的中譯本嗎? 雖然目前都是看英文網站居多但看得有點痛苦= = 怕買書來 一本厚厚的都是英文會翻幾頁就不想看了囧 ※ 編輯: aa06697 (140.116.1.136), 04/07/2016 10:53:05

04/07 13:43, , 34F
深入淺出 JavaScript 程式設計,有「程式
04/07 13:43, 34F

04/07 13:43, , 35F
設計」這本
04/07 13:43, 35F

04/07 15:44, , 36F
JavaScript優良部份有中譯 只學基本觀念很推這本
04/07 15:44, 36F

04/07 15:44, , 37F
也比較薄
04/07 15:44, 37F

04/07 17:17, , 38F
優良部份推!會提到你問的這些事情,可是可能要多看幾
04/07 17:17, 38F

04/07 17:17, , 39F
次,一開始可能會有些吃力
04/07 17:17, 39F

04/07 22:21, , 40F
thx~~~~~~~
04/07 22:21, 40F
文章代碼(AID): #1N1Jpp7L (Ajax)
文章代碼(AID): #1N1Jpp7L (Ajax)