2014-10-07 3 views
1

У меня есть JSON конфигурации, как:three.js Создание объекта динамически

{ shape:[ 'SphereGeometry', [7, 16, 16] ] } 

и попытаться загрузить модели, как:

new THREE[shape[0]].apply(this, shape[1]) 

Как вы можете увидеть «новый» и «применить» не вариант здесь. Кто-нибудь знает трюк или подсказку, как я могу решить свою проблему здесь?

Заранее спасибо.

ответ

0

Использование .Нанесите() и новый вместе в целом не очень но вот как оно идет:

function dynamicShape() { 
    return THREE[shape[0]].apply(this, shape[1]); 
} 
dynamicShape.prototype = THREE[shape[0]].prototype; 

var sphere = new dynamicShape(); 

Это должно сработать. Вот скрипка с использованием некоторого примера кода для рендеринга: http://jsfiddle.net/jcc6zbtn/

0

Вот один из способов сделать это, используя функцию reviver. Преимущество состоит в том, что процесс разбора напрямую заботится о создании экземпляров правильных типов объектов, а не в двух шагах.

var shapes = { 'Rectangle': Rectangle }, //same as THREE in your code 
    shapeJson = '{ "shape": ["Rectangle", [2, 4]] }', 
    shape = shapeFromJson(shapeJson); 

console.log(shape); 

function instanciate(ctor, args) { 
    var instance = Object.create(ctor.prototype); 
    ctor.apply(instance, args); 
    return instance; 
} 

function createShape(shape, args) { 
    return instanciate(shapes[shape], args); 
} 

function shapeFromJson(json) { 
    return JSON.parse(json, function (key, val) { 
     return key? val : createShape(val.shape[0], val.shape[1]); 
    }); 
} 

function Rectangle(height, width) { 
    this.height = height; 
    this.width = width; 
} 
Смежные вопросы