2016-06-15 3 views
6

함수 범위 지정은 JavaScript에서 유일한 개인 정보를 제공합니다.JavaScript의 개인 정보 보호

그래서 표준 :이 주입 된 의존성에 대한 캡슐화를 제공하지 않습니다 점에서

function Ctor(dep1, dep2) { 
    this._dep1 = dep1; 
    this._dep2 = dep2; 
} 

Ctor.prototype.foo = function() { 
    // use this._dep1/2... 
} 

는 ... 문제가있다. 실제 캡슐화를 제공

(foo의 위치면에서 약간의 차이이기는하지만) 대안이 될 수 있습니다

function factory(dep1, dep2) { 
    return { 
    foo: partial(foo, dep1, dep2), // or use bind (partial could be a library fn for partial application) 
    }; 
} 

function foo(dep1, dep2) { 
    // use dep1/2 
} 

그러나 나는 거의이 패턴을 볼 수 없습니다. 후자를 사용하지 않는 좋은 이유가 있습니까?

+1

어느 정도까지는 Symbol 속성은 가능한 한 더 나은 것으로 만들 것입니다. o 다른 키와 충돌하지 않도록 보장 된 속성 키를 생성합니다. 그러나, 그들은 여전히 ​​완전히 "사적인"것은 아닙니다. – Pointy

+1

닫기를 위해 투표하십시오 - 왜?! – Ben

답변

3

이미 두 번째 패턴의 장점을 설명했습니다. 단점은 다음과 같습니다

  • 당신이 중 하나를 수행해야합니다 (민간 방법은 밀접하게 공개 한 관련,하지만 거의 다른 개인 방법에 관련된 경우에도), 또는 문자 오브젝트의 모든 public 메소드를 반복 가시성 그룹화 방법 (jsdoc에서는 잘 작동하지 않습니다).

  • 코드는 약간의 성능을 희생 클래스의 모든 인스턴스에 대해 별도의 함수 객체 (이것은 보통 문제가되지 않습니다,하지만 때로는 수 있음) 많은 프로그래밍 언어에서 개인 수식과 달리

  • 이 캡슐화를 소개합니다 비록 잘못 적용 되어도 내가 실제로하는 일을 알고있다하더라도 (역사적으로 JavaScript는 환경이 바뀌고 많은 사람들이 성공 가능성을이 확장성에 기인 한 것임)

+0

"코드가 클래스의 모든 인스턴스에 대해 별도의 함수 객체를 도입합니다"- 코드에서 직접 'bind'를 사용하는 경우에도 마찬가지입니다. 'foo : foo.bind (null, dep1, dep2)'? – Ben

+0

예, 방금 Chrome에서 테스트했습니다. 'foo.bind (null, 1, 2) === foo.bind (null, 1, 2)'false를 반환합니다. – meriton

+0

아, 네 말이 맞아. 확인 감사합니다. 또한 https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_objects/Function/bind – Ben

3

간단함 : 왜?

"개인 정보"는 상당히 과장되었습니다. 정말로 원하는 사람은 아무 것도 숨기지 않습니다. "보호 된"또는 "개인"멤버를 갖는 것은 프로그래머의 이익을위한 것입니다. 특히 특정 멤버의 사용 방법을 나타 내기위한 것입니다 (여기은 공개 API입니다. 여기은 여기 너무 민감하지 않습니다. 그것은 당신이 무엇을하는지 모르는 한). 그게 다야. 밑줄을 시작하는 것과 같은 명명 규칙은 완벽하게 구현할 수 있습니다. 회원 이름이 밑줄로 시작하는 경우 자신이하는 일을 알지 못하는 경우 회원 이름을 건드리지 마십시오.

뒤로 거꾸로 굽히는 것이 본질적으로 필요하지 않습니다.

+0

질문에 대한 답변 : "공유 된 코드베이스에서 작업 할 때 '_foo'를 사용하면 이름이 '이름'이기 때문에 사용되지 않는다고 확신 할 수 없습니다." 후자의 경우 신뢰도가 크게 높아져 코드의 비 기능적 측면이 향상됩니다. – Ben

+1

직장 동료에 대한 신뢰가 없다면 비공개 멤버를 비공개로 설정해도 도움이되지 않습니다. 이것이 프로그래머 간의 의사 소통 및/또는 검토 문제이며 해결해야 할 기술적 인 문제는 아닙니다. 신뢰할 수없는 프로그래머가 사설 멤버에 액세스하는 것보다 더 많은 일이 발생할 수 있습니다. – deceze

+0

소프트웨어 개발에는 많은 문제가 있습니다. 너 몇 명있어. 그것은 우리가 그 문제들에 의해 초래 된 위험을 시도하고 완화해서는 안된다는 것을 의미합니까? – Ben

관련 문제