eval 反序列化后 Javascript 原型(prototype)未定义

标签 javascript json prototype eval

尝试反序列化 JSON 数据并更新每个对象的原型(prototype)并继承一个通用函数。

但是,以下脚本会抛出错误“people[0].getFullName 不是一个函数”。反序列化对象的原型(prototype)在分配后似乎未定义。

<html>
<head>
<script>
var json = '[ {"firstName": "John", "lastName": "Smith"}, {"firstName": "Nancy", "lastName": "Jones"} ]';
var people;
eval('people = ' + json);

function Person() { }

Person.prototype.getFullName = function() {
    return this.firstName + ' ' + this.lastName;
}

//assign prototype
for(var i=0; i < people.length; i++){
    people[i].prototype = new Person();
}


if(people[0].getFullName() !== 'John Smith')
    alert('Expected fullname to be John Smith but was ' + people[0].getFullName());
</script>
</head>
</html>

最佳答案

由 x=new Person() 创建的对象 x 链接到/继承自 Person.prototype,但就 ecma 标准而言,您不能按顺序更改 x.prototype之后更改该链接/继承,这是只有 new 关键字拥有的“魔力”。
Mozilla 似乎提供了一种在通过非标准属性创建对象后更改对象链接的方法 __proto__ .

仅限 Mozilla:

//assign prototype
for(var i=0; i < people.length; i++){
    people[i].__proto__ = Person.prototype;
}

应该在任何地方工作:

function Person(data) { this.data = data; }
Person.prototype.getFullName = function() {
    return this.data.firstName + ' ' + this.data.lastName;
}

eval('people = ' + json);
//assign prototype
for(var i=0; i < people.length; i++){
    people[i] = new Person(people[i]);
}

关于eval 反序列化后 Javascript 原型(prototype)未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1084832/

相关文章:

javascript - 如何覆盖原型(prototype)中的事件监听器?

javascript - 如何使用 ASP.Net MVC 将 JS 文件中的 javascript 函数调用到 Controller ?

javascript - 如何将粘性菜单包含在 float 侧边栏中?

javascript - 如何阻止图例在 Google Charts 动画期间消失?

c++ - 如何为 jsoncpp 编写 cmake 模块?

javascript - 试图理解 JavaScript 中原型(prototype)和构造函数之间的区别

javascript - 相当于 Promise 的 async 函数

c# - 附加而不是覆盖 Web API 列表

Jquery解析JSON并延迟后追加

javascript原型(prototype)继承混淆