gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 05:56:30 27 4
gpt4 key购买 nike

尝试反序列化 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com