【问题标题】:How can I change the type of a Javascript object?如何更改 Javascript 对象的类型?
【发布时间】:2017-04-16 16:33:01
【问题描述】:

我正在构建一个基于网页的文本冒险游戏,例如银河系漫游指南或 Zork 系列。我将这个游戏中的对象(例如位置或玩家数据)保存在 localStorage 中,以便玩家可以继续他们的进度。

我正在使用CircularJSON 对这些对象中的循环引用进行字符串化以保存它们。

但是,当这些对象被解析时,它们是默认的Object类型。

这是一个问题,因为 Area 等类型中的函数:

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 对象的类型?

【问题讨论】:

标签: javascript json object prototype


【解决方案1】:

选项 #1(使用 ES2015): const newObject = Object.setPrototypeOf(oldObject, Player.prototype)

这很慢,请查看documentation

警告:根据现代 JavaScript 引擎优化属性访问的本质,更改对象的 [[Prototype]] 在每个浏览器和 JavaScript 引擎中都是一项非常缓慢的操作。

这是...的替代方案

选项 #2(已弃用): oldObject.__proto__ = Player.prototype

选项 #3: const newObject = new Person(/* Use the properties of oldObject */)

【讨论】:

  • “const”是什么意思,和“var”有什么区别?
  • 这是一个完全不同的问题。为了更改对象的类型,您可以使用任何您喜欢的方式,constletvar。它们是 ES2015/ES6 的特性。如果您想了解它们,请查找 ES6 简介developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
猜你喜欢
  • 1970-01-01
  • 2011-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-20
  • 2016-04-15
  • 2017-03-04
  • 2015-01-14
相关资源
最近更新 更多