Re: [ js ] object 和 prototype的問題

看板Ajax作者 (大嘴先生)時間11年前 (2014/08/18 06:11), 11年前編輯推噓0(000)
留言0則, 0人參與, 最新討論串3/3 (看更多)
※ 引述《btsken (郝小明)》之銘言: : 是這樣的,我不太會描述這個問題.... : 就直接用例子說明好了XD : 假設我在有一個物件Man : function Man(name) { : this.name = name; : } : Man.prototype.walk = function() { : console.log("walk"); : } : 我將物件轉成json : var json = JSON.stringify(new Man("tom")); : 然後再轉回來 : var man = JSON.parse(json); : 我想問的是,從json轉回來的物件有辦法保有prototype的方法嗎 : 小弟觀念沒有很好,先謝謝各位了~ JSON.stringify在轉物件成JSON字串之前會先檢查該物件是否具有toJSON方法 若有的話就對toJSON方法的回傳值JSON化 透過這方式就能額外加入或去除資料 因此你可以這樣寫 function Man(name) { this.name = name; } Man.prototype.walk = function() { console.log("walk"); } Man.prototype.toJSON = function() { return {name : this.name, walk : this.walk.toString()}; } var json = JSON.stringify(new Man("tom")); =>{"name":"tom","walk":"function () {\n console.log(\"walk\");\n}"} 要從JSON轉回來之後可以再檢查字串是否以function(開頭 若是就塞進new Function變回來 但這樣做還是無法保留context、scope chain的內容 而且原本的walk函式會因此從原型上的method變成物件本身自有的method 因此通常的作法還是讓JSON只保留實例自身的資料就好 物件或原型上的資料與method則在接收端那邊另外套上去更保險 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.164.52.54 ※ 文章網址: http://www.ptt.cc/bbs/Ajax/M.1408313463.A.3D1.html ※ 編輯: mrbigmouth (1.164.52.54), 08/18/2014 06:16:11
文章代碼(AID): #1JyIXtFH (Ajax)
討論串 (同標題文章)
文章代碼(AID): #1JyIXtFH (Ajax)