Чтобы вызвать функцию конструктора производного объекта, вам сначала нужно узнать, какой конструктор вы хотите вызвать.Вы не сообщаете подробности о том, как вы в настоящее время кодируете эту информацию о типе в вашей сериализованной полезной нагрузке, поэтому предположим, что у вас есть что-то вроде следующего:
var MyDerivedType = function () {...};
MyDerivedType.prototype.__derivedTypeName = 'MyDerivedType';
MyDerivedType.deserialize = function ( input ) {
var obj = JSON.parse( input );
return new MyDerivedType( obj );
};
Если вы не назначаете свой производныйвведите в глобальную область видимости, тогда вы должны быть в состоянии обратиться к ним во время десериализации.Вот пример хранения их на самом конструкторе Sprite
:
Sprite.derivedTypes = Sprite.derivedTypes || {};
Sprite.derivedTypes['MyDerivedType'] = MyDerivedType;
Тогда вы можете избежать использования eval
и вызывать соответствующий десериализатор следующим образом:
Sprite.deserialize = function(input) {
// json parse the data string to pull out our derived type
var o = JSON.parse(input);
// delegate to the derived type's deserialize method
return Sprite.derivedTypes[o.__derivedTypeName].deserialize(input);
};
Естьничего не встроено в js / browser js среды, которые обеспечивают десериализацию для "классов" в том смысле, в каком вы знакомы с .net.