Rev. 2.73

하늘의 오브젝트에, 인수 object(null의 경우는 하늘 오브젝트)를 계승시키고 있습니다.이것에 의해 인수 object의 복제를 얻습니다.이것에 Enumerable 클래스와 Hash 클래스를 계승시켜, 반환합니다.

복수의 클래스를 「계승한다」라고 하는 것도 이상합니다만.그러한 의미에서는 말 그대로의 「확장한다」라고 하는 편이 정확한 의 것인지도 알려지지 않습니다.

이른바 연상 배열을 취급하는 클래스입니다.Hash 클래스도, Enumerable 클래스와 같이, 그인스턴스가 작성될 것은 없습니다.추상 클래스 취급입니다.다만, 실장 방법은 조금 특수합니다.타클래스에 계승시키는 것이 아니라, $H함수에 의해 반환되는오브젝트가Hash 클래스를 계승하고 있다, 라고 하는 형태가 됩니다.Hash 오브젝트를 만들어 각 프롭퍼티를 추가하는 것보다도, 커스텀 오브젝트를 만들어 거기에 Hash를 계승시키는 편이 민첩한, 이라고 하는 것이겠지요.(2006/08/03덧붙여 씀.new Hash({name:value,···}); (이)라고 하는 방법도 있던 생각은 듭니다만.메서드가 덧쓰기되는 것을 무서워했는지요...) 먼저 써 버립니다만, $H함수에 건네줄 수 있는 커스텀 오브젝트에는, 이하의 제한이 있습니다.

* 벌써 실장되고 있는 메서드와 같은 이름의 프롭퍼티는 만들 수 없다.

Enumerable 클래스, Hash 클래스가 가지는 메서드와 같은 이름의 프롭퍼티는 만들 수 없습니다. $H함수에 건네주는 커스텀 오브젝트로 사용할 수 없는 프롭퍼티명
each, all, any, collect, detect, findAll,grep, include, inject, invoke,
max, min, partition, pluck,reject, sortBy, toArray,zip, inspect, map,
find, select, member, entries, _each, keys, values, merge, toQueryString

사용하면(자), 반환되는 오브젝트로부터 그 프롭퍼티가 사라집니다.(실제로는 메서드로 덧쓰기되고 있다)

var hash = $H({zero:"영", one:"일", two:"이", inspect:"캐릭터 라인화 ", three:"참"});
alert(Object.inspect(hash));
//#<Hash:{'zero': '영', 'one': '일', 'two': '이', 'three': '참'}> 라고 표시된다.

inspect라고 하는 프롭퍼티가 사라졌습니다.inspect 메서드는 기능하고 있습니다.

* 값으로 해서 함수는 취할 수 없다.
함수는 메서드로 간주해져 각 메서드의 처리 대상이 되지 않습니다.

var hash = $H({zero:"영", one:"일", two:"이",
               func:function(){alert("!");},
               three:"참"});
alert(Object.inspect(hash));
//#<Hash:{'zero': '영', 'one': '일', 'two': '이', 'three': '참'}> 라고 표시된다.
hash.func();
//"!"라고 표시된다

func 메서드는 작성됩니다만, inspect의 처리 대상으로부터는 제외되고 있습니다.

응―, 후자는 좋다고 해, 전자는 위험하네요···.무심코 사용해 버려도, 깨닫지 못할지도 모르고...

_each 메서드
Enumerable 클래스를 계승하는 경우에 필요한 메서드.자오브젝트의 각 프롭퍼티의 프롭퍼티명과 값을 격납한 오브젝트를,인수의 함수iterator에 건네주어 실행합니다.이것에 의해, Enumerable로부터 계승한 메서드로 각 프롭퍼티를 처리할 수 있습니다.

for in루프에 의해 자오브젝트 this의 모든 프롭퍼티·메서드를 처리하고 있습니다.값value가 함수(메서드)이면 처리하지 않습니다.pair에, 프롭퍼티명 key와 값value를 순서에 격납한 배열을 작성합니다.더욱, pair의 key 프롭퍼티에 프롭퍼티명 key, value 프롭퍼티에 값value를 작성·격납하고 있습니다.즉, iterator내에서는, 프롭퍼티명이라면 pair[0]으로 pair.key, 값이라면 pair[1]으로 pair.value의 어디라도 액세스 할 수 있게 됩니다.

keys 메서드
전술 Enumerable 클래스로부터 계승한 pluck 메서드에 의해, 자오브젝트의 프롭퍼티명만의 배열을 반환합니다.pluck가 처리하는 것은 전술_each 메서드내에서 작성되는 pair 오브젝트입니다.자오브젝트 this 그 자체는 아니기 때문에 주의해 주세요.

values 메서드
이쪽은 자오브젝트의 값만의 배열을 반환합니다.

merge 메서드
자오브젝트 this에 인수 hash를 머지 하는 메서드입니다.인수 hash의 각 프롭퍼티를, inject 메서드에 의해, 자오브젝트 this의 동일 프롭퍼티명에 설정해 있습니다.따라서, 중복 하는 프롭퍼티명이 있었을 경우, 추가하는 hash의 프롭퍼티에 덧쓰기됩니다.

인수 hash를$H함수로 처리하고 있으므로, hash는 단순한 커스텀 오브젝트에서도 좋은 것 같습니다. this의 복제를 작성해, this를 파괴하지 않게 하기 (위해)때문에군요.(같은 실수를···orz)

var org = $H({zero:"영", one:"일", two:"이"});
var add = {two:"2 ", three:"참"}; //$H로 처리하지 않아도 가능
var ret = org.merge(add);
alert(Object.inspect(ret));
//ret는 Hash 오브젝트(를 계승).
//#<Hash:{'zero': '영', 'one': '일', 'two': '2', 'three': '참'}> 라고 표시된다.

toQueryString 메서드
자오브젝트 this의 각 프롭퍼티를, 기존 encodeURIComponent 함수에 의해URIencode 해, 프롭퍼티명과 값을 「=」으로 연결한 캐릭터 라인으로 합니다.게다가로 각 캐릭터 라인을 「&」으로 연결해, 그 캐릭터 라인을 반환합니다.

var hash = $H({zero:"영", one:"일", two:"이", three:"참"});
alert(hash.toQueryString());
//"zero=%E9%9 B%B6&one=%E5%A3%B1&two=%E5%BC%90&three=%E5%8 F%82"라고 표시된다.

inspect 메서드
Hash를 캐릭터 라인화하는 메서드.Object.inspect 메서드 경유로 사용되는 것이 전제입니다. ···이 정도의 처리라면 이제(벌써) 설명은 불필요할까요^^; 예에 대해서도, 전술의 다른 메서드에 있으므로 할애 합니다.

Comments

Got something to add? You can just leave a comment.

Your Reaction Time!

captcha

avatar