我想创建一个具有所有Backbone.Model功能(验证,默认等)的模型,还有另一个原型。具体来说,我希望原型和构造函数来自THREE.Object3d。我使用threejs r69 (最新)
目前我这样做:
var MyObj = new function(){...}
MyObj.prototype = Object.create(THREE.Object3D.prototype);
MyObj.prototype.constructor = THREE.Object3D;
如何在拥有THREE.Object3d原型的同时使MyObj成为Backbone.Model实例,这样我就可以简单地将它添加到场景中,并像普通的THREE.Object3d一样使用它,同时不破坏Backbone 。模型界面?
当我尝试使用时:
var MyObj = Backbone.Model.extend(THREE.Object3D.prototype);
我收到以下错误:
DEPRECATED:Object3D的.eulerOrder已移至Object3D的.rotation.order。
three.js:7306 Uncaught TypeError:无法读取属性' order'未定义的
有几个属性undefined
,但我不确定为什么会这样?为什么旋转未定义?
编辑:看我的小提琴here 。打开控制台以查看错误!
答案 0 :(得分:1)
我会通过扩展Backbone.Model的prototype
然后调用THREE.Object3D
的构造函数来实现。这可能发生在:
var Object3DModel = Backbone.Model.extend({
initialize: function() {
_(this.prototype).extend(THREE.Object3D.prototype);
THREE.Object3D.apply(this, arguments);
}
});
我使用underscore
扩展来扩展原型。
您可以看到working jsbin。
修改的
我只是玩了更多,似乎更好的方法是:
// Start with a constructor, calling the two constructors of the classes
var Object3DModel = function() {
THREE.Object3D.apply(this, arguments);
Backbone.Model.apply(this, arguments);
};
// Copy Object3D Prototype
Object3DModel.prototype = new THREE.Object3D();
// Append Backbone.Model prototype
var ref = new Backbone.Model();
for ( var name in ref ) {
Object3DModel.prototype[name] = ref[name];
}
因为 THREE 库正在使用getter和setter,所以继承它们的正确方法就是这个。
无论如何,我创建了一个JsBin,它已经过测试的基本功能。
答案 1 :(得分:0)
这可能适合你。
var myObj = Backbone.Model.extend(THREE.Object3D.prototype);