Re: [ js ] object 和 prototype的問題

作者: mrbigmouth (大嘴先生)   2014-08-18 06:11:01
※ 引述《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則在接收端那邊另外套上去更保險

Links booklink

Contact Us: admin [ a t ] ucptt.com