[問題] 怎麼forin出class的function name?

看板Ajax作者 (香榴槤)時間6年前 (2018/03/17 21:32), 6年前編輯推噓5(5011)
留言16則, 2人參與, 6年前最新討論串1/2 (看更多)
在ES5的時候我是這樣宣告物件的 function a(){ this.OuO.apply(this, arguments); } a.prototype.OuO = function(){ } var b = new a() for(var key in b){ console.log(key); //OuO } 可以成功打印出OuO 但使用了ES6的Class變成 class a{ constructor(){ } OuO(){ } } 一樣new一個a 但forin卻什麼都沒有 這問題已經煩惱我一天惹 請各位神人幫忙QQ -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.194.180.238 ※ 文章網址: https://www.ptt.cc/bbs/Ajax/M.1521293543.A.3E9.html

03/17 21:55, 6年前 , 1F
ES6 的 class method 是 non-enumerable 的,不能用 for
03/17 21:55, 1F

03/17 21:55, 6年前 , 2F
in 或 Object.keys() 去取得 method name
03/17 21:55, 2F

03/17 22:07, 6年前 , 3F
https://jsfiddle.net/5xw6gas3/ 硬幹的話是這樣
03/17 22:07, 3F
感謝大大支援>< 剛剛GOOGLE了Class 與 non-enumerable 有人提供了相對的方法 class a { constructor(){ } OuO(){ } } var b = new a; console.log(Object.getOwnPropertyNames(b.constructor.prototype)); ※ 編輯: givemoney (123.194.180.238), 03/17/2018 22:14:42

03/17 23:16, 6年前 , 4F
想問原 PO 為什麼要在建構函式 a 裡再 this.OuO.apply
03/17 23:16, 4F

03/17 23:18, 6年前 , 5F
把 OuO 方法定義在 prototype 上就不用再定義一次物件
03/17 23:18, 5F

03/17 23:19, 6年前 , 6F
實體自己的 OuO 了。而且 ES6 Class 定義的方法等同於
03/17 23:19, 6F

03/17 23:20, 6年前 , 7F
定義在 prototype 上:a.prototype.OuO
03/17 23:20, 7F

03/17 23:23, 6年前 , 8F
所以原 PO 的 class a 會等同於只把 OuO 定義在原型上
03/17 23:23, 8F

03/17 23:31, 6年前 , 9F
的 function a。而 for-in 只會迭代 enumerable 屬性
03/17 23:31, 9F

03/17 23:39, 6年前 , 10F
但 class method 是 non-enumerable 的
03/17 23:39, 10F

03/17 23:43, 6年前 , 11F
如果原 PO 想和你第一個 function a 一樣定義物件實體
03/17 23:43, 11F

03/17 23:44, 6年前 , 12F
的 OuO 方法,也可以在 ES6 Class 的 constructor 裡
03/17 23:44, 12F

03/17 23:44, 6年前 , 13F
這樣寫:this.OuO = this.OuO.apply(this, ...args)
03/17 23:44, 13F

03/17 23:46, 6年前 , 14F

03/17 23:47, 6年前 , 15F
只是這樣和 function a 裡再 this.OuO.apply 一樣怪 XD
03/17 23:47, 15F

03/18 00:28, 6年前 , 16F
我發現我有一些沒說清楚的地方 Orz,已經回一篇來說了
03/18 00:28, 16F
文章代碼(AID): #1QhHZdFf (Ajax)
文章代碼(AID): #1QhHZdFf (Ajax)