2012-07-17 5 views
0

javascript의 Object 프로토 타입에 네임 스페이스 메서드를 추가하려고합니다.개체 프로토 타입에 네임 스페이스 메서드 추가

var myObj = {} 
myObj.namespace('nested.objects.are.created.if.not.present') 

하지만 잃어버린 오전 : 내가 할 수 있도록하고 싶습니다 무엇

이있다. 제네릭 함수를 사용하는 것은 매우 쉬운 것처럼 보이지만 프로토 타입에 추가하는 것은 아닙니다. 여기

내가 무엇을 가지고 :

Object.prototype.namespace = function(ns_string) { 
    var parts = ns_string.split('.'); 
    var parent = this; 
    var i; 
    var length = parts.length 
    for (i = 0; i < length; i++) { 
     // Create a property if it doesnt exist 
     if (typeof parent[parts[i]] === "undefined") { 
      parent[parts[i]] = {}; 
     } 
     parent = parent[parts[i]]; 
    } 
} 

그것은 부모의 값이 정확하게 각각의 시간을 설정하지 않은 것 같습니다. 나는 실종되었다는 것을 아주 기본적이라고 확신하지만, 그것이 무엇인지 확실하지 않습니다.

미리 감사드립니다. Onkelborg 말했듯이

리처드

+0

방금 ​​코드 (http://jsfiddle.net/TykH3/)를 사용해 보았지만 Object에 대한 프로토 타입을 수정하는 것이 좋지 않다고 생각합니다. – Onkelborg

+0

[당신은 할 수 없습니다 jQuery를 사용하려면] (http://docs.jquery.com/Won't_Fix#Object.prototype_Issues)를 수행하십시오. – Esailija

+0

@ByRichardPowell 누군가가 실제로 괜찮다고 말하면 오해했을 수도 있습니다. 참조가 있으십니까? – Esailija

답변

1

좋아, 우선은이 좋은 생각 (이것은 아주 나쁜 생각이 말을 나는 심지어 지금까지 갈 것)이 아니다. 핵심 객체의 프로토 타입에 속성을 추가하는 것은 문제를 묻는 것입니다. (라이브러리에서 수, 당신의 수)의는이 방법, 사이트에 대한 몇 가지 코드를 추가한다고 가정 해 봅시다 수행합니다

for (var key in {foo: 'bar'}) { 
    // How many times will this iterate? 
} 

키로서 'foo는'점점 한 번만 반복해야 루프, . 그러나 실제로는 네임 스페이스 속성이 속성으로 표시되기 때문에 두 번 반복됩니다.

어쨌든 이렇게하고 싶다면 기본 코드가 작동해야합니다. parent의 값을 엉망으로 만들 수있는 유일한 방법은 this이 꺼져있는 경우이며,이 경우 foo.namespace.call(bar) 또는 그와 비슷한 것을 사용하여 다른 "this"가있는 메소드를 호출해야합니다.

call (또는 형제 자매 인 apply)을 사용하지 않으면 모든 것이 작동합니다.

+0

자세한 설명을 주셔서 감사합니다. 명확성을 위해 모든 핵심 객체의 프로토 타입을 추가하는 것이 좋지 않거나 객체 프로토 타입이라고 말하는 것입니까? (혼란스러운 용어로 유감스럽게도 여전히 이해할 수 있습니다.) –

+0

Object에 추가하는 것은 특히 좋지 않지만 같은 기본 문제가 그 중 하나에 적용됩니다. 자세한 내용을 보려면이 링크를 클릭하십시오. http://perfectionkills.com/extending-built-in-native-objects-evil-or-not/ – machineghost

+0

대단히 감사합니다. 링크 된 기사와 기사는 흥미로운 읽을 거리로 제공됩니다. –

관련 문제