0

는 애디 오스 마니에서 자바 스크립트 디자인 패턴을 읽고, 그리고 문서에이 간단한 할당은 '이미 존재하는 객체/네임 스페이스 덮어 쓰기 방지'에 사용됩니다var에 대한 이점 myObj = myObj || myObj가 이미 존재하면 {}?

var myNS = myNS || function() {}; 

그래서 나는 그것이 할당 이해를 변수가 이미 존재하면 동일한 객체를, 그렇지 않으면 이상적으로 빈 객체를 만듭니다. 이 객체의 프로토 타입에 메소드를 추가한다고 가정하겠습니다. 그러나 이미 존재하는 유사하게 이름이 지정된 객체는 이미 '안녕하세요!'라는 비슷한 이름의 메소드를 이미 가지고 있습니다. 다음과 같은 일이 일어나야합니다.

myNS.prototype.sayHello = function() { return 'Hello!' }; 
myNS.sayHello(); // Hello! ?? 

그리고 원래 myNS.sayHello() // Hi!

는 여전히, 덮어 쓰기? 즉,이 경우 조건부 변수 할당은 한 수준의 이름 충돌 방지 기능을 추가하는 것을 제외하고는 무엇입니까? 또는 나는 이것에 완전히 틀린가?

+0

개체는 기능이 아닙니다. Prototype 속성에 물건을 추가하는 것은 말이되지 않습니다. (프로토 타입 프로퍼티도 가지고 있지는 않습니다.) – Pointy

+0

@ Pointy를 지적 해 주셔서 고마워요. – Tyblitz

+0

논리'?|'는 아무 것도 도움이되지 않습니다. 기존의'.prototype.sayHello' 메소드를 덮어 쓰지 않으려면 비슷한 가드가 필요합니다. 요점은 접근 방식을 이해하고 필요한 곳마다 사용하는 것입니다. –

답변

1

해당 할당 형식의 목적은 이름 충돌을 피하기위한 것이 아니라 이미 존재하는 개체를 유지하는 것입니다.

예를 들어 개체에 속성이나 메서드를 추가하는 두 개의 코드가 있고 그 중 어느 것이 먼저 실행되는지 또는 제어 할 수없는 코드가 두 개있는 경우 할당을 사용하도록 할 수 있습니다 그렇게 : 다른 곳

var myNS = myNS || {}; 
myNS.doSomething = function(){ ... }; 

과 : 두 코드가 실행되면

var myNS = myNS || {}; 
myNS.doSomethingElse = function() { ... }; 

, 당신은 두 가지 방법으로 객체를 가지고 있고, 어느 코드가 존재 또는 특정 순서로 실행하기 위해 다른에 의존 .


새 개체를 원하면 새로운 개체를 만들어야합니다.

명명 충돌을 피하려면 모든 변수가 해당 범위에 대해 로컬이되도록 함수 범위에 코드를 유지하고 전역 범위에서 같은 이름의 모든 변수를 음영 처리해야합니다. 이 접근법은 다른 라이브러리와 간섭 할 수있는 전역 범위에서 가능한 한 적게 배치하기 위해 많은 라이브러리에서 사용됩니다.

+0

또 하나의 질문 : 당신이 만드는 것은 무엇이든간에 항상 실패의 단일 지점을 가지고 있다는 것을 의미하지 않습니까? (즉, 당신의 객체/기능/w/e를 정의하는데 사용 된 첫 번째 용어가 이미 정의 된 경우) – Tyblitz

+1

@ 티 블리츠 : 당신이 의미하는 것이 확실하지 않습니다. 그 객체가 이미 존재할 수 있다는 것과 그 객체에 추가되는 것과 충돌한다는 것을 의미한다면 그것은 사실입니다. 그것은 그것을 막기위한 것이 아닙니다. – Guffa

1

기능을 myNS에 추가하고 다른 스크립트는 myNSsayGoodbye 기능을 추가하는 스크립트가있을 수 있습니다. 그 스크립트의 각

var myNS = myNS || {}; 패턴을 사용하여 의미 당신이 할 수있는 그 :

  • 로드 스크립트를 모두 존재하지 않는 개체에 쓰기를 시도하지 않고 스크립트를로드 한

    • , 어떤 순서로든 두 번째 것은 첫 번째 것을 파괴하지 않고

    두 개의 스크립트가 객체의 동일한 메소드를 덮어 쓰지 않도록 보호하지 않습니다.

  • +0

    그래서 모듈 식 JS 접근 방식과 이름 충돌을 피하는 것과 관련이 있습니까? – Tyblitz

    +1

    'sayHello' 스크립트의'myNS'가'sayGoodbye' 스크립트의'myNS'와 충돌하는 것을 막기 위해 이름 충돌 방지 기능이 있습니다. – Quentin