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