2013-09-05 2 views
2

캔버스 API를 배우고 있으며이를 수행하는 데 간단한 물리 엔진을 만들고 싶습니다. 이번 여름에 Backbone.js로 작업 한 후에 JS에서의 OO 접근법에 영감을 받았습니다.여러 번 상속 할 수있는 객체를 만드는 방법은 무엇입니까?

해결할 내 문제를 알고, 나는 내 솔루션을 제안 할 것이지만이 문제를 해결할 더 좋은 방법이 있다고 생각한다면 그렇게 말하십시오.

// Obj is a general object that can be basically anything. (Ball, rock, ground plane) 
var Obj = Extendable.extend(
    position : [0, 0], // Coordinates 
    velocity : [0, 0], // Vector, 
    acceleration : [0, 0], // Vector 
    shape : (Shape) 
); 

var Ball = Obj.extend(
    shape : (Shape) 
); 

var ball1 = new Ball(); 
var ball2 = new Ball(initializer); 

목표는 좋은 것 즉, 그것뿐만 아니라 다중 상속을 가질 수 있다면 new Object();를 호출하기 전에 내가 원하는만큼을 연장 할 수있다.

는 지금은 이것으로 왔어요 : 당신의 생각에 대한

var Extendable = { 
    extend : function(methods) { 
     var f = function() { 
      if (this.init) this.init.apply(arguments); 
     }; 

     f.prototype = Object.create(_.extend({}, this.prototype, methods)); 
     f.extend = this.extend; 

     return f; 
    } 
}; 

//The problem is that this only allows the use of .extend() one time... 
EDIT: Now half way working. 

감사합니다!

+0

나는 실제로 내가 해결책을 찾은 것 같아요. 나는 그것을 조금 시험해보고 대답을 게시 할 것이다. 문제는, 실제로 해결책을 찾은 경우, _.extend()의 논리를 잊었다는 것입니다. 프로토 타입 체인을 유지할 수 없어도 객체를 통과합니다. 체인에 관한 모든 것을 잊어 버리는 완전히 새로운 객체를 만듭니다. –

+0

다른 누구도 같은 문제가있는 경우 대답을 추가했습니다. :) –

답변

0

마침내이 문제를 해결할 방법을 찾았습니다. 문제는 내가 너무 장님 때문에 _extend()가 배후에서 무엇을하는지 생각할 수 없다는 것이었다. 나는 그것을 염두에두고있는 기능과 만 사용했다. Prototype.js도 프로토 타입 체인을 객체와 마술처럼 병합 할 수 없다는 사실에 대해 생각하지 않았습니다. (그리고 그들은 하나이 주장하지 않았다 결코 그들은 그것이 객체를 병합 할 수 있습니다 주장한다..)

그래서, 단지 작은 변화가 작동 할 필요가있다 :

extend : function(methods) { 
    // Define a constructor that will be available on all "classes". 
    var f = function() { 
     if (this.init) this.init.apply(arguments); 
    }; 

    // Add the current prototype to the chain. (Added in "methods"-argument in a previous extend. 
    // Then we're going to add the new methods to the prototype. 
    f.prototype = _.extend(Object.create(this.prototype || {}), methods); 
    // Add the .extend() on the object to allow further inheritance. 
    f.extend = this.extend; 

    return f; 
}, 
관련 문제