我正在构建一个基于网页的文本冒险游戏,如Hitchhiker的Galaxy指南或Zork系列。我将此游戏中的对象保存在localStorage中,例如位置或玩家数据,以便玩家可以继续进行。
我正在使用CircularJSON对这些对象中的循环引用进行字符串化以保存它们。
但是,解析这些对象时,它们是默认的对象类型。
这是一个问题,因为区域:
等类型的功能var Area = function (tempdescription, tempinitialDesc, tempobjArr) {
this.isExplored = false;
this.description = tempdescription;
this.objArr = tempobjArr;
this.paths = [];
this.initialDesc = tempinitialDesc;
};
Area.prototype.getIndex = function (tempstr) {
if(thePlayer.playerLocation.objArr.length > 0) {
for(var i = 0; i < thePlayer.playerLocation.objArr.length; i++) {
if(thePlayer.playerLocation.objArr[i].name.indexOf(tempstr) != -1) {
return i;
}
}
}
return -1;
};
或播放器:
var Player = function (defaultLocation) {
this.inv = []; // an array of game objects
this.playerLocation = defaultLocation; // the player's current location
this.moveCount = 0;
this.score = 0;
};
Player.prototype.getIndex = function (tempstr) {
if(thePlayer.inv.length > 0) {
for(var i = 0; i < thePlayer.inv.length; i++) {
if(thePlayer.inv[i].name.indexOf(tempstr) != -1) {
return i;
}
}
}
return -1;
};
由我创建,需要出现在每个对象顺序中,以便我的其他代码能够工作。
我需要以简单的方式更改几个对象的类型(如果存在),因为当我保存这些对象时,在游戏完成时可能会有几十个对象。
有没有办法改变Javascript对象的类型?
答案 0 :(得分:0)
选项#1(使用ES2015): const newObject = Object.setPrototypeOf(oldObject, Player.prototype)
这很慢,请查看documentation:
警告:根据现代JavaScript引擎优化属性访问的性质,在每个浏览器和JavaScript引擎中更改对象的[[Prototype]]是非常慢的操作。
这是......的替代品。
选项#2(已弃用): oldObject.__proto__ = Player.prototype
选项#3: const newObject = new Person(/* Use the properties of oldObject */)