2013-08-04 2 views
4

Я хочу расширить класс Object3D класса Three.js, но не могу понять, как это сделать.Расширение классов Three.js

Этот вопрос, который я прочитал, перечитал и попробовал, но не могу заставить его работать для меня.

Is there a way to extend a ThreeJS object?

Может кто-нибудь предложить некоторую конкретную коду о том, как получить это происходит? Вот что у меня есть на данный момент:

var MyObject3D = function() { 
    THREE.Object3D.call(this); 
    MyObject3D.prototype = new THREE.CubeGeometry(); 
    MyObject3D.prototype.constructor = MyObject3D; 
} 

И для создания экземпляра:

var thing = new MyObject3D(); 
var testGeo = new THREE.CubeGeometry(10, 10, 10); 
var testMat = new THREE.MeshPhongMaterial(); 
var testMesh = new THREE.Mesh(testGeo, testMat); 
thing.add(testMesh); 

Но называть «добавить» метод MyObject3D экземпляра возвращает ошибку, что «вещь» не имеет какого-либо метода " Добавить."

В чем дело?

ответ

10

Вы устанавливаете прототип в CubeGeometry, который не имеет метода добавления. Основываясь на том, как вы пытаетесь создать экземпляр объекта, похоже, что вы действительно хотите, чтобы ваш объект имел прототип Mesh.

Скорее всего, вы хотите что-то вроде этого:

var MyObject3D = function() { 
    // Run the Mesh constructor with the given arguments 
    THREE.Mesh.apply(this, arguments); 
}; 
// Make MyObject3D have the same methods as Mesh 
MyObject3D.prototype = Object.create(THREE.Mesh.prototype); 
// Make sure the right constructor gets called 
MyObject3D.prototype.constructor = MyObject3D; 

Затем его экземпляр:

var testGeo = new THREE.CubeGeometry(20, 20, 20); 
var testMat = new Three.MeshNormalMaterial(); 
var thing = new MyObject3D(testGeo, testMat); 
+0

Вы !! CubeGeometry вещь была просто ошибкой копирования/вставки, когда я создал вопрос, но вы все еще решили мою проблему :) Я устанавливал прототип нового класса внутри функции конструктора. Перемещение за пределы зафиксировано. Мне любопытно, почему это изменило бы ситуацию. (Возможно, вы заметили, что я все еще изучаю OO в Javascript.) – John

+1

Прототип применяется к экземпляру объекта до запуска конструктора, поэтому, когда вы устанавливали MyObject3D.prototype в конструкторе, это не вступает в силу для первого объект, созданный с помощью этого конструктора. Однако после того, как конструктор запустится один раз, прототип изменился бы, поэтому все будущие объекты этого типа будут иметь прототипы, которые выглядели так, как вы хотели. (Все они были бы немного разными, потому что вы создавали новый объект для каждого!) – IceCreamYou

+0

Я действительно понимаю, что, как ни странно. Благодаря!! – John