JavaScript 异常 : is not a function

标签 javascript arrays json object local-storage

我在 JavaScript 中创建了两个对象原型(prototype)。这些是对象构造函数。您可以看到 Board 对象包含一个 PostIt 对象数组:

function PostIt(id, msg, img, pos) {
  this.id = id;
  this.msg = msg;
  this.img = img;
  this.pos = pos.slice(); // copy of array
}

function Board() {
  this.postIts = [];   // Empty array of PostIt objects
} 

每个原型(prototype)都有其方法(getter/setter),并且 Board 也有从数组中推送和弹出 PostIt 对象的方法。

我还在 Board 中实现了一种机制,通过 localStorage 保存和检索数组:

Board.prototype.save = function () {
  // Clean localstorage first
  localStorage.clear();

  if (this.getNumPostIts() > 0) { // It array is not empty
    localStorage.setItem('myboard', JSON.stringify(this.postIts));
  }
};

// Retrieve array of postit objects from local storage
Board.prototype.load = function () {
  this.postIts = JSON.parse((localStorage.getItem('myboard')));
};

PostIt 对象已正确检索,但我不确定将它们分配给 Board 对象的 this.postIts 数组时会发生什么:

this.postIts = JSON.parse((localStorage.getItem('myboard')));

在加载网站时完成此操作后,当我尝试调用数组中任何 postit 对象的方法时,我会收到异常。例如加载文档后的以下代码

myBoard = new Board();

if (localStorage.myboard) { // Local Storage has data
  // Retrieve data from local storate and dump it to myBoard
  myBoard.load();

  // Display Id for every postit
  for (var i=0; i < myBoard.getNumPostIts(); i++) {
    var pId = myBoard.getPostItByArrayIndex(i).getId();
    console.log("PostIt #%d has id = %d", i, pId);
  }    
} 

调用 PostIt 对象的 getId() 方法会引发异常: jQuery.Deferred 异常:myBoard.getPostItByArrayIndex(...).getId 不是函数 TypeError: myBoard.getPostItByArrayIndex(...).getId 不是函数

我不明白为什么“getId”不是一个函数。我调用这个getter方法有什么问题吗? 编辑: .getId() 是 PostIt 对象原型(prototype)的 getter 方法:

PostIt.prototype.getId = function() {
  return this.id;
};

最佳答案

JSON 格式不存储转换为 JSON 的对象的原型(prototype)。因此,当您再次解析这些 JSON 字符串时,对象将只是普通对象,与原型(prototype)没有任何关系,例如 PostIt。因此,像 getId 这样的原型(prototype)方法不再适用于这些对象。

同样,您也会丢失对象的直接方法,因为 JSON 不提供函数格式。

如何让它发挥作用

我首先会更改 PostIt 构造函数,以便它具有所有参数的默认值。更具体地说,它需要对 pos 属性进行一些调整:

function PostIt(id, msg, img, pos) {
  this.id = id;
  this.msg = msg;
  this.img = img;
  this.pos = Array.isArray(pos) ? pos.slice() : []; // default is empty array
}

现在您可以使用 Object.assign 将 JSON 解析的对象转换回 PostIt 对象:

Board.prototype.load = function () {
  this.postIts = JSON.parse((localStorage.getItem('myboard')))
                     .map(x => Object.assign(new PostIt, x));
};

关于JavaScript 异常 : is not a function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42471569/

相关文章:

javascript - 如何使用javascript获取文件选择事件中文件控件的文件名

javascript - AngularJS 和 Web API 中请求的资源上不存在 'Access-Control-Allow-Origin' header

javascript - 使用 javascript 添加后刷新 document.element

c++ 2d数组导致段错误(核心已转储)

arrays - VBA 停止使用临时范围

python - Python 中的 8 Queens 解决方案

javascript - 使用js回调函数更新json文件内容

javascript - 为什么每次函数更改后都会存储多个对象?

javascript - 在 phonegap 中使用 zip.js 解压文件

javascript - 追加在最后一个 child 之前