javascript-调用从storage.StorageArea读取的对象的多态方法

javascript-调用从storage.StorageArea读取的对象的多态方法,javascript,polymorphism,prototype,storage,Javascript,Polymorphism,Prototype,Storage,我有一个原型A和方法m()以及它的两个继承人:B和C,每一个都覆盖了m()。A、B和C的许多对象存储在数组arr中。我可以将此数组保存到或从中加载它。但在加载之后,似乎get数组中的对象不是A、B或C的实例,而是没有方法的属性集。这样,arr[i].m()将导致 TypeError:arr[i].m不是函数 我可以使用A.prototype.m.call(arr[I])但是多态性在哪里呢?什么是有效的方法 编辑:添加了一些代码 var A = function(name) { this.

我有一个原型
A
和方法
m()
以及它的两个继承人:
B
C
,每一个都覆盖了
m()
A
B
C
的许多对象存储在数组
arr
中。我可以将此数组保存到或从中加载它。但在加载之后,似乎get数组中的对象不是
A
B
C
的实例,而是没有方法的属性集。这样,
arr[i].m()
将导致

TypeError:arr[i].m不是函数

我可以使用
A.prototype.m.call(arr[I])
但是多态性在哪里呢?什么是有效的方法

编辑:添加了一些代码

var A = function(name) {
    this.name = name
}
A.prototype.m = function() {
    console.log("I am " + this.name);
}

var B = function(name) {
    A.apply(this, [name]);
}
B.prototype = Object.create(A.prototype);
B.prototype.constructor = B;

var C = function(name) {
    A.apply(this, [name]);
}
C.prototype = Object.create(A.prototype);
C.prototype.constructor = C;

function main() {
    let arr = new Array(3);
    arr[0] = new A("A");
    arr[1] = new B("B");
    arr[2] = new C("C");

    console.log("-- before storing --");
    arr[0].m();
    arr[1].m();
    arr[2].m();

    browser.storage.local.set({arr});
    browser.storage.local.get({arr}).then(onSuccess);
}

function onSuccess(result) {
    console.log("Result: ");
    console.log(result);
    console.log("-- after storing --"); 
    result.arr[0].m();
    result.arr[1].m();
    result.arr[2].m();
}

调用
browser.storage.local.set
时,首先将提供的对象字符串化,然后将其存储

现在,当您试图获取其get
JSON.parse
的值时

现在,正如您所知,
JSON.parse(JSON.stringify(anyobject))
将返回一个与anyobject没有链接的完全克隆对象。它们都有不同的参考文献。这就是为什么你会经历这样的结果


一般来说,我主要使用
window.localStorage.setItem
,我需要显式地传递
stringized
值,在获取值后,我
解析它以获取对象。

请添加一些代码。@saikatajra done
browser.storage.local
不起作用。你是哪个浏览器using@SaikatHajraMozilla Firefox,
存储
权限是必需的。运行代码需要付出一些努力。这里是控制台输出(我在
console.log(“--before-storage--”)之后添加了
console.log(arr)
行):@saikatajra当我得到时,我的对象不是
A
B
C
的实例,而是
对象的实例。我真的不明白你的建议。我应该使用
window.localStorage.setItem
而不是
browser.storage.local.set
还是在
browser.storage.local.get
之后?获取的对象链接到它的原型在哪里?不,我没有建议您使用
window.localStorage.seItem
。我提到了幕后发生的事情,以及为什么你会得到一个全新的对象,而不是
a
B
C
哦,我早就明白了,但是理解并不能解决问题,所以我在这里,我认为如果您存储在
localStorage
中,就没有任何方法可以用相同的引用返回相同的对象。