尝试反序列化 JSON 数据并更新每个对象的原型并继承公共函数。
但是,以下脚本会引发错误“people[0].getFullName 不是函数”。反序列化对象的原型在赋值后似乎未定义。
<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 似乎提供了一种在通过非标准属性创建对象后更改对象链接的方法__原型__ https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Object/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]);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)