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
时,首先将提供的对象字符串化,然后将其存储
现在,当您试图获取其getJSON.parse
的值时
现在,正如您所知,JSON.parse(JSON.stringify(anyobject))
将返回一个与anyobject没有链接的完全克隆对象。它们都有不同的参考文献。这就是为什么你会经历这样的结果
一般来说,我主要使用
window.localStorage.setItem
,我需要显式地传递stringized
值,在获取值后,我解析它以获取对象。请添加一些代码。@saikatajra donebrowser.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
中,就没有任何方法可以用相同的引用返回相同的对象。