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

时间:2018-03-09 15:38:38

标签: javascript polymorphism prototype storage

我有方法A的原型m()和其继承人的两个:BC,每个都已覆盖m()ABC的许多对象都存储在数组arr中。我可以将此数组保存到storage.StorageArea或从那里加载它。但加载后,似乎getten数组中的对象不是ABC的实例,而只是没有方法的属性集。这样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();
}

1 个答案:

答案 0 :(得分:0)

当您首先调用browser.storage.local.set提供的对象获取stringified时,它会被存储。

现在,当您尝试获取值时,获取JSON.parse

现在,您知道JSON.parse(JSON.stringify(anyobject))将返回一个完全克隆对象,该对象与 anyobject 没有任何关联。他们都有不同的参考。这就是你遇到这种结果的原因。

一般情况下,我主要使用window.localStorage.setItem,我需要显式传递stringified值,并在获取值parse之后返回以获取对象。