2013-03-25 2 views
7
Object.prototype.doSomething = function(p) { 
    this.innerHTML = "<em>bar</em>"; 
    this.style.color = "#f00"; 
    alert(p); 
}; 

document.getElementById("foo").doSomething("Hello World"); 

<div id="foo"><strong>foo</strong></div>Javascript의 Object에 프로토 타입 함수를 정의해도 괜찮습니까?

은 위의 코드는 잘 작동합니다.

하지만 어딘가에서 이것을 보았습니다. Do not mess with native Object. 그런 것 같습니다.

그래서 의 객체에 프로토 타입 함수를 정의해도 괜찮습니까? 이 일을해서는 안되는 이유가 있습니까?

+0

라이브러리 다른 사람이 소모 될 것이다 방법 - 객체의 프로토 타입으로 정의되지 않았습니다, 전화하는 방법에인가? 아니면 자신의 응용 프로그램 코드를 위해? –

+0

다른 사람들도 사용할 수있는 작은 도서관을 쓰고 있습니다. 아래에 제시된 대답과 같이 코드를 작성한 사람이 누구이든 관계없이이 작업을 수행하면 안됩니다. – user1643156

답변

5

Object.prototype에 추가 할 수있는 유일한 안전한 방법은 비 열거 속성을 만들 수 ES5 방법을 Object.defineProperty을 사용하는 것입니다

Object.defineProperty(Object.prototype, 'doSomething', { 
    value: function(p) { ... }, 
    enumerable: false, // actually the default 
}); 

이것은 당신이 for (key in object) 할 경우 새 속성이 표시되지 않는 것을 보장 .

이전 버전의 ECMAScript/JavaScript에서는 열거 할 수없는 속성이 없기 때문에이 기능을 안정적으로 사용할 수 없습니다.

어떤 경우에도 HTML 페이지 요소에만 메서드가 적용되는 경우 Object.prototype 대신 Element.prototype에이 메서드를 추가하는 것이 좋지만 이전 브라우저 (IE)에서는 그렇게하면 불평 할 수 있습니다.

+0

그래도 어쨌든 ['hasOwnProperty'] (https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/hasOwnProperty) 모범 사례가 아닙니까? –

+0

@RoatinMarth 아니오, IMHO' hasOwnProperty'는 모범 사례입니다. ES5 브라우저에서는 불필요합니다. 'Object.prototype'으로 더러워진 코드는 추방되어야합니다. jQuery조차도'hasOwnProperty' 테스트를 생략하고 남용하는 코드를 사용하면 실패 할 것이라고 명시 적으로 명시합니다. – Alnitak

+0

이전 버전의 Javascript에는 열거 할 수없는 속성이 없습니다. '이전 버전'을 의미하는 버전입니까? – user1643156

1

일반적으로 좋지 않습니다. 그 기능은 현재 에서 사용할 수 있습니다. 객체 프로토 타입 (많은 기능)을 사용하는 앱의 모든 항목은 Object proto를 나열하는 함수에 나타납니다. 당신은 객체 프로토 타입에 물건을 추가하는 경우

function MyObject { 
    ... 
} 

MyObject.prototype.doSomething = function() { 
    ... 
} 

var myObj = new MyObject(); 
1

, 당신은 당신이로 반복 처리하는 추가 한 열거 특성 때문에 for p in obj를 사용하여 좋은 개체 반복 기능을 잃게 :

더 나은 옵션은 별도의 프로토 타입을 정의하는 것입니다 잘 모든 물집에입니다. 예를 들어

: 예기치 않게

Object.prototype.doSomething = function(p) { 
    this.innerHTML = "<em>bar</em>"; 
    this.style.color = "#f00"; 
    alert(p); 
}; 

for (p in {foo:"bar"}){ 
    console.log(p); 
} 

//foo 
//doSomething 

, 당신은 또한 doSomething 기록을 얻을 것이다. 이 문제를 해결하려면 객체를 반복 할 때 hasOwnproperty 검사를 추가해야하지만 위험한 점은 일반 객체가 리터럴에 지정된 것과 다른 속성을 가질 것으로 기대하지 않는 다른 코드를 깨뜨릴 수 있다는 것입니다.

+0

추가 한 _enumerable_ 속성 이후 ... – Alnitak

+0

@Alnitak 업데이트 됨, 감사합니다. –

0

또 다른 옵션은

function doSomething(p) { 
    this.innerHTML = "<em>"+p+"</em>"; 
    this.style.color = "#f00"; 
    alert(p); 
}; 

//

doSomething.call(document.getElementById("foo"),"Hello World"); 
관련 문제