Question: Attempting to deserialize JSON data and update each object's prototype and inherit a common function.

However, the following script throws error "people[0].getFullName is not a function". The prototype for deserialized objects appears to be undefined after assignment.

```
<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>

```

Answer: 
The `prototype` property is a property of *constructors*, not of *instances*. What you are looking for is the property **`__proto__`**:

```
people[i].__proto__ = new Person();

```

The bad news is that **it does not work in all browsers**. It does work in Firefox and Safari, it does not work in IE. An alternative is to use constructors to instantiate your array of people. Unfortunately you'll have to copy all properties:

```
function Person(obj) {
    for (var property in obj) {
        this[property] = obj[property];
    }
    return this;
}
Person.prototype.getFullName = function() {
    return this.firstName + ' ' + this.lastName;
}

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

```
An object x that is created by x=*new Person()* is linked to/inherits from Person.prototype, but as far as the ecma standard is concerned you cannot change x.prototype in order to change that link/inheritance afterwards, that's the "magic power" only the *new* keyword possesses.  

Mozilla seems to offer a way to change the object link after an object has been created through the non-standard property [\_\_proto\_\_](https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Object/Proto).

Mozilla-only:

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

```

should work anywhere:

```
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]);
}

```