문제

간단하게 추가했어요 .js 꽤 평범한 공통 작업 종류의 기능이 추가된 내 페이지에 파일을 추가하세요. Object 그리고 Array 프로토타입.

시행착오를 거쳐서 나는 어떤 기능이든 추가하는 것이 가능하다는 것을 알아냈습니다. Object.prototype, 이름이나 기능에 관계없이 jQuery에서 Javascript 오류가 발생합니다.

그 범인?

Object.prototype.foo = function() {
    /*do nothing and break jQuery*/
};

1056행에서 오류가 발생했습니다. jquery-1.3.2.js, attr:function { } 선언에서:

/*Object doesn't support this property or method*/
name = name.replace(/-([a-z])/ig, function(all, letter) {
            return letter.toUpperCase();
        });

분명히 G.replace는 정의되지 않았습니다.

내가 프로토타입을 만들면서 머리를 감싸지 않는 뭔가가 있다는 것은 분명하지만 그것이 무엇인지 알아내는 데는 비참하게 실패하고 있습니다.

분명히 말하면 해결 방법을 찾는 것이 아니며 이미 처리했습니다.내가 찾고 있는 것은 왜?.기능을 추가하는 이유는 무엇입니까? Object.prototype 이 코드를 깨뜨릴 수 있나요?

도움이 되었습니까?

해결책

당신은 절대로 확장해서는 안됩니다 Object.prototype. 그것은 jQuery를 깨는 것 이상을합니다. JavaScript의 "Hashtables as Hashtables"기능을 완전히 깨뜨립니다. 하지 마십시오.

John Resig에게 물어 보면 그는 당신에게 말할 것입니다. 같은 것.

다른 팁

단순히 for...in 루프를 망친 경우라면 Object.defineProperty를 사용하여 fn을 열거 가능하게 만들지 않고 추가할 수 없나요?

그래서:

Object.defineProperty(Object.prototype, "foo", { 
    value: function() {
        // do stuff
    },
    enumerable : false
});

나를 위해 일하는 것 같습니다.이것이 여전히 나쁜 형태로 간주됩니까?

나는 무언가를 추가한다는 데 동의한다 Object.prototype 주의를 기울여야하며 피해야합니다. 다음과 같은 다른 솔루션을 찾으십시오.

객체에 추가 한 다음 call 또는 apply, 필요에 따라. 예를 들어:

Object.foo = function () { return this.whatever()}

그런 다음 객체에서 호출하십시오.

Object.foo.call(Objname);  // this invokes the function as though it were a
                           // method of Objname.  That is, its like Objname.foo()

재미를 위해 다음을 추가 할 수 있습니다 (예, 조금 위험하다는 것을 알고 있습니다 ...) :

Function.using = Function.call; // syntactic sugar

이제 쓸 수 있습니다 Object.foo.using(Objname) 그리고 그것은 문장처럼 읽습니다.

그러나 원칙적으로 큰 프로토 타입을 변경하지 않아도됩니다.

나는이 문제에 대해 머리를 두드렸다.

interface Object
{
    GetType: () => string;
    ToString: () => string;
    GetHashcode: () => number;
    Equals: (obj: any) => boolean;
}

object.prototype가 jQuery를 깨뜨리므로 DefineProperty를 사용하기 위해 위에서 언급 한 솔루션을 기본값으로 기본적으로 사용했지만 아무런 주장도하지 않습니다.

좋은 소식은 DefineProperty를 해킹하고 실제로 매개 변수를 수락 할 수 있다는 것입니다. 내 구현은 다음과 같습니다.

Object.defineProperty(Object.prototype, "Equals",
    {
        value: function (obj: any)
        {
            return obj == null && this == null
                    ? true
                    : obj != null && this == null
                        ? false
                        : obj == null && this != null
                            ? false
                            : this.GetHashcode() == obj.GetHashcode();
        },
        enumerable: false
    });

이것은 작동하며 jQuery와 충돌하지 않습니다.

객체에 함수를 추가하는 것을 의심합니다. 프로토 타입은 jQuery를 직접 깨뜨립니다. 사이트 전반에 걸쳐있는 루프가 HasOwnProperty 점검으로 래핑되어 있는지 확인하십시오. 전체적으로 기능을 추가하고 반복의 결과는 예측할 수 없을 수 있으므로 다음과 같습니다.

Object.prototype.foo = function() {};    
var myObject = {m1: "one", m2: "two" };

for(var i in myObject) { if(myObject.hasOwnProperty(i)) {
   // Do stuff... but not to Object.prototype.foo
}}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top