2011-11-09 2 views
2

내 코드에 hasOwnProperty를 많이 사용하고 있으며 길게 입력하고 낙타를 입력하여 입력합니다. 나는 단지 myObj.has('x')라고 말할 수 있기를 원했지만, Object.prototype에서 hop의 별칭을 만들려고했을 때 'has'가 이제 for..in 루프에서 열거됩니다. 내가 원하는 것을 얻는 가장 좋은 방법은 무엇입니까? 나는 단지 has(obj, prop)처럼 작동하는 전역 함수를 만들 수 있다는 것을 의미한다. 그러나 점 형식이 더 마음에 들고 자바 스크립트가 슬리브를 가질 수있는 트릭을 알고 싶다. 그래서 제안을 찾고있다.hasOwnProperty의 이름을 바꾸지 만 열거 형을 금지합니다.

업데이트 : 이것은 꽤 해킹 된 것 같습니다. String.prototype.in = function(obj){return obj.hasOwnProperty(this)} 확인 하시겠습니까? 그런 다음 내가 말할 수있다. if ('x'.in(myObj)) {... 불행히도 hasOwnProperty 앨리어싱이 아닌 다른 함수 호출 계층을 추가하지만 구문이 마음에 든다.

답변

3

당신은 오직 enumera Object.defineProperty()를 사용 ES5 호환 브라우저에서 기 : 비 열거 속성을 설정하는

Object.defineProperty(myObj, "has", { value: Object.prototype.hasOwnProperty }); 

defineProperty() 기본 설정됩니다. 더 나은 ES3 접근 방식은 기능 별칭이 될 것이며 Object.prototype에 충실하지 않습니다

var has = function (ob, prop) { 
    return Object.prototype.hasOwnProperty.call(ob, prop); 
} 

나는 미래에 어쩌면 잠재적 명명 충돌을 제외하고, String.prototype.in 방법 중 하나를 자신의 잘못 아무것도 표시되지 않습니다, 그러나 그것은 당신의 부름입니다. String.prototype.on이라고하면 in 연산자로 모호성이 제거됩니다.

+0

감사합니다. 나는 defineProperty를 사용하기 전에 시도했다. 그러나 나는 그것을 잘못 사용하고 있었다고 생각한다. – Moss

1

Object.prototype.has = Object.prototype.hasOwnProperty이 사용

Object.prototype.has = function(x) { 
    return this.hasOwnProperty(x) 
} 

이 SomeNativeThing.prototype를 사용할 때주의해야하고 무엇을

로 @pomeh 상태를 무시 아닌 보장하기 위해

if ((typeof Object.prototype.has) !== 'function') { 
    ... 
} 

를 사용하는 트릭을 할해야 더 좋은 방법

+2

왜 'Object.prototype.has = Object.prototype.hasOwnProperty;'가 아닌가? – pomeh

+1

sidenote : Object.prototype을 확장하지 마십시오. myObject.prototype을 확장하십시오. –

+0

@pomeh 맞습니다. 당신의 기술은 더 빠르고 안전합니다 –