2017-11-29 2 views
0

이 코드는 fabricjs 사이트에서입니다 :fabricjs toObject 인생

var rect = new fabric.Rect(); 

rect.toObject = (function(toObject) { 
    return function() { 
     return fabric.util.object.extend(toObject.call(this), { 
     name: this.name 
    }); 
    }; 
    })(rect.toObject); 

내 질문은 : 왜 그랬는지 그것은 바로 호출 기능을 가지고있다. 이런 식으로 쓸 수는 없으며 같은 결과를 얻을 수 없습니다.

var rect = new fabric.Rect(); 
    rect.toObject = function() { 
      return fabric.util.object.extend(rect.toObject.call(this), { 
      name: this.name 
      }); 
    }; 

두 버전간에 차이가 있습니다.

답변

0
1 > var rect = new fabric.Rect(); 
2 > rect.toObject = function() { 
3 > return fabric.util.object.extend(rect.toObject.call(this), { //here you are calling same toobject 
4 >  name: this.name 
5 > }); 
6 > }; 

라인 3에서 당신은 당신이 지금 정의 같은 재정의 된 메서드 rect.toObject를 참조합니다 rect.toObject를 호출 감사드립니다. 따라서 한 번 호출하면 루프가 반복됩니다. 그리고 8 rect.toObject 외부 키로 통과 원래의 방법입니다 라인에서 당신에게 여기 Uncaught RangeError: Maximum call stack size exceeded

1 > var rect = new fabric.Rect(); 
2 > rect.toObject = (function(toObject) { 
3 > return function() { 
4 >  return fabric.util.object.extend(toObject.call(this), { 
5 >  name: this.name 
6 >  }); 
7 > }; 
8 > })(rect.toObject); 

을 줄 것이다. 그래서 4 행에서 toObject.call은 오버라이드 된 메소드 대신 원래의 메소드를 호출합니다. 따라서 원래 toObject 메서드의 반환 값을 name 속성으로 확장하고 확장 된 값을 반환합니다.

이는 특정 개체입니다. 클래스 메서드를 재정의하려면 수행해야 할 작업

fabric.Rect.prototype.toObject = (function(toObject) { 
    return function() { 
    return fabric.util.object.extend(toObject.call(this), { 
     name: this.name 
    }); 
    }; 
})(fabric.Rect.prototype.toObject); 
+0

답장을 보내 주셔서 감사합니다. 알았다. 작성 방법 : rect.toObject = (함수 .... 끝까지) 은 rect라는이 인스턴스의 toObject 메소드에만 영향을 주며 다른 Rect 객체에는 영향을주지 않습니다. 맞습니까? 모든 Rect에 영향을 주려면 다음과 같이 작성해야합니다. Rect.prototype.toObject = (함수 ... 끝까지) 맞습니까? 고맙습니다. – Jay

+0

@Jay check updated answer. – Durga