Да, это - стандартный способ сделать specializiation явное инстанцирование. Как Вы заявили, Вы не можете инстанцировать этого шаблона с другими типами.
Редактирование: исправленный на основе комментария.
Свойство прототипа
является свойством конструкторов , а не экземпляров . Вы ищете свойство __ proto __
:
people[i].__proto__ = new Person();
Плохая новость в том, что оно работает не во всех браузерах . Он работает в Firefox и Safari, но не работает в IE. Альтернативой является использование конструкторов для создания экземпляра массива людей. К сожалению, вам придется скопировать все свойства:
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]);
}
По сути, вам нужно поместить объект JSON В объект Person, а затем просто применится getFullName. Я немного переписал то, что вам пришлось немного поработать. Возможно, есть и лучшие способы, но я думаю, что это то, что вы собирались сделать ...
<html>
<head>
<script>
//NOTE: Sending around JSON arrays leaves bad security holes for non-IE browsers (__defineSetter__)
var json = '[ {"firstName": "John", "lastName": "Smith"}, {"firstName": "Nancy", "lastName": "Jones"} ]';
//Persons is just a temporary JSON array
var persons = eval(json);
//constructor takes optional object instance and copies all properties if it gets one
function Person(person) {
if (person) {
for(var prop in person)
this[prop] = person[prop];
}
}
//Prototype applies to all Person objects
Person.prototype.getFullName = function() {
return this.firstName + ' ' + this.lastName;
}
//Create People array
var people = new Array();
for(var i=0; i < persons.length; i++){
people[i] = new Person(persons[i]);
}
//Now do your check
if(people[0].getFullName() !== 'John Smith')
alert('Expected fullname to be John Smith but was ' + people[0].getFullName());
</script>
</head>
</html>
Объект x, созданный с помощью x = new Person () , является связан с / наследуется от 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]);
}
for(var i=0; i < people.length; i++){
people[i].getFullName = Person.prototype.getFullName; }