gpt4 book ai didi

javascript - 字符串化javascript函数

转载 作者:行者123 更新时间:2023-12-02 05:17:57 26 4
gpt4 key购买 nike

我正处于游戏开发的最后阶段,我有一堆这样的对象;

roomBedroom = function () {
this.title = "Bedroom";
this.description = "I'm in a bedroom";
this.noun = "bed";
this.entities = new Array();
}

var bedroom = new roomBedroom();

我现在要做的是将我所有的游戏对象放入一个数组中;

var savedGameObjects = {};
savedGameObjects['bedroom'] = bedroom;
var jsonGame = JSON.stringify(savedGameObjects);

计划是保存已保存的 GameObjects 数组,然后在用户再次加载游戏时调用它。

如果我将 savedGameObjects['bedroom'] = bedroom; 替换为 savedGameObjects['bed'] = 'slappy'; 它可以工作,但当我有对象时就不行.

我确实需要将对象保存为当前状态。我宁愿不通过每个对象来保存关键信息。

最佳答案

这感觉有点乱,但这是我现在能想到的最好的

你的序列化/反序列化工具

这将在序列化之前将 obj.constructor.name 附加到 obj.__prototype。反序列化后,原型(prototype)将放回原处。

(function(global) {

function serialize(obj) {
obj.__prototype = obj.constructor.name;
return JSON.stringify(obj);
};

function deserialize(json) {
var obj = JSON.parse(json);
obj.__proto__ = global[obj.__prototype].prototype;
return obj;
}

global.serialize = serialize;
global.deserialize = deserialize;

})(window);

示例“类”

(function(global) {

function Foo() {
this.a = "a";
this.b = "b";
}

Foo.prototype.hello = function() {
console.log("hello");
}

global.Foo = Foo;

})(window);

让我们试试看

var foo = new Foo();

var json = serialize(foo);
console.log(json);

var newFoo = deserialize(json);
console.log('a', newFoo.a); // a
console.log('b', newFoo.b); // b

newFoo.hello(); // hello

注意一些陷阱

如果您使用表达式来定义您的“类”,您将拥有一个无名的构造函数

var Foo = function() {};
var foo = new Foo();
foo.constructor.name; // ""

相对于命名函数

function Foo() {}
var foo = new Foo();
foo.constructor.name; // Foo

为了使serializedeserialize 正常工作,您需要使用命名函数


另一个问题

deserialize 方法期望您的“类”存在于同一命名空间中(在本例中为 window)。您可以用另一种方式封装您的游戏对象类,只需确保重新配置反序列化方法,以便它可以根据需要找到原型(prototype)。


让它变得更好

不是将 serialize 附加到全局 window,您可以让 serialize 存在于(例如)GameObject.prototype 然后你的个人类可以从 GameObject 继承。序列化一个对象就很简单了

var json = foo.serialize();
// {"a":"a","b":"b","__prototype":"Foo"}

然后您可以将 deserialize 定义为 GameObject.deserialize 并恢复 foo

var foo = GameObject.deserialize(json);

替代方案

您可以巧妙地使用 Factory Method Pattern,而不是实现自定义序列化器和反序列化器。 .

这可能有点冗长,它确实让您可以单独控制游戏对象的反序列化/恢复方式。

var savedData = // your normal JSON here

var player = Player.create(savedData.player);

var items = [];
for (var i=0, i<savedData.items.length; i++) {
items.push(Item.create(savedData.items[i]));
}

var map = Map.create(savedData.map);

这是一个非常有趣的问题,我相信您不是第一个遇到它的人。我真的很好奇其他人的想法。

关于javascript - 字符串化javascript函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20533797/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com