2014-11-14 2 views
2

사용하여 응용 프로그램 및 prototype.js에 (1.3)의 이전 버전이 있습니다이것은 어떻게 재귀 적 구조가됩니까?

Object.extend = function(destination, source) { 
    for (property in source) { 
    destination[property] = source[property]; 
    } 
    return destination; 
} 

Object.prototype.extend = function(object) { 
    return Object.extend.apply(this, [this, object]); 
} 

지금 일반적으로이 작품을 좋아하지만, 때로는 그 마지막 함수는 재귀 전환 및 호출 스택의 크기를 초과 할 때까지 자신을 호출합니다. 자바 스크립트 마법사가 아니기 때문에 다른 사람에게이 스크립트가 상당히 명백 할 수 있습니다. 누군가가이 문제에 대해 밝히고 싶습니까?

+0

Object.extend가 정의되어 있지 않으면 Object.prototype.extend가 재귀 적으로 변하게됩니다. 데모 코드? – 1983

+0

나는 여기에 게시 된 그 기능이 "재귀 적으로 돌아갈 것"이라고 믿지 않는다. 절대로 스스로를 호출하지 않는다. 그런 기능의 "딥 카피 (deep copy)"버전은 원형 그래프로 진행되어 미쳐 버릴 수 있지만 게시 된 코드는 그러한 기능이 아닙니다. – Pointy

+0

그러나 확장 기능을 호출 할 때 Object.extend가 정의되어 있지 않으면 프로토 타입에 정의 된 함수가 사용되지 않습니까? –

답변

2

myObject.propertyName으로 개체의 속성에 액세스하면 JS는 자신의 속성 (myObject)을 먼저 봅니다. 해당 propertyName을 가진 사람이 발견되면 가져옵니다. 그곳에 없을 때만 JS는 프로토 타입 (이후 프로토 타입 체인 전체)에 해당 이름의 속성이 있으면 검색합니다. IST 후자는 첫 번째 및 그 쓸모에 의해를 그림자가 있기 때문에 일반적으로 좋은 생각이 왜

그게 전부는 프로토 타입에 같은 이름을 가진 개체에 직접 재산 extend 다른이 있습니다.

할당이 Object.extend = function() {...}; 인 경우이 함수는 기본 Object-constructor의 고유 한 속성으로 설정됩니다. 이제 Object.extend(..) 함수가 실행되면 Object.prototype.extend가있을 수 있습니다.

.prototype.extend가 활동하기 시작하고 Object.extend(...)을 수행 할 때 실행됩니다에는 자신의 재산 extend 없습니다 만. 그리고 프로토 타입 함수 내부에서 어떤 일이 발생합니까? 먼저 Object 자신의 extend을 찾고 찾지 못했습니다. .prototype.extend : 재귀 호출이 있습니다.

가끔이 발생하면 번에 Object.extend가 정의되지 않습니다.