첫째, 많은 정적 도구 메서드가 매달린 싱글톤 개체가 있습니다. 그 중 하나는 배열이나 객체를 순회하는 데 사용되는 각각입니다.
다음과 같이 코드 코드를 복사합니다.
var NativeForEach = [].forEach
var NativeMap = [].map
바르틸 = {
각각: 함수(obj, 반복자, 컨텍스트) {
if (obj == null) 반환
if (nativeForEach && obj.forEach === NativeForEach) {
obj.forEach(반복자, 컨텍스트)
} else if (obj.length === +obj.length) {
for (var i = 0; i < obj.length; i++) {
if (iterator.call(obj[i] || context, obj[i], i, obj) === true) 반환
}
} 또 다른 {
for(obj의 var k) {
if (iterator.call(obj[k] || context, obj[k], k, obj) === true) 반환
}
}
},
맵: 함수(obj, 반복자, 컨텍스트) {
var 결과 = []
if (obj == null) 결과 반환
if (nativeMap && obj.map === NativeMap) return obj.map(iterator, context)
this.each(obj, function(val, i, coll) {
결과[i] = iterator.call(context, val, i, coll)
})
결과 반환
}
}
컬렉션(Array, Hash)에 대해 작동하는 all, some 등과 같은 유틸리티 함수도 있습니다. 사용시에는 util.xx 메소드를 사용하세요.
컬렉션 클래스가 정의된 경우 이 클래스 내부에 컬렉션 데이터가 있습니다.
다음과 같이 코드 코드를 복사합니다.
함수 컬렉션(데이터) {
this.data = 데이터 ||
// 기타 속성
// this.xxx = yyy
}
Collection.prototype = {
// 어떤 메소드
}
util의 메소드를 다음과 같은 컬렉션 클래스에 쉽게 복사할 수 있습니다.
다음과 같이 코드 코드를 복사합니다.
함수 copyMethod(clazz, obj) {
for(obj의 var 메소드) {
clazz.prototype[메소드] = function() {
var args = [].slice.call(인수)
var 대상 = this.data
args.unshift(대상)
obj[메서드].apply(obj, args)
}
}
}
copyMethod(컬렉션, 유틸리티)
이렇게 복사하면 Collection 인스턴스는 util에 대한 메소드를 가지게 되며, util에 의해 동작하는 컬렉션 객체(첫 번째 파라미터)는 Collection의 this.data가 됩니다. 다음과 같이 this.data를 직접 탐색할 수 있습니다.
다음과 같이 코드 코드를 복사합니다.
var coll = 새 컬렉션([10, 20, 30])
// 횡단
coll.each(함수(k) {
console.log(k)
})
// 작동하다
var arr = coll.map(function(k) {
returnk-5
})
console.log(arr) // 5, 15, 25
이 패턴은 $.each/$.map이 $().each/$().map에 편리하게 복사되는 jQuery와 같은 많은 오픈 소스 라이브러리에서 사용됩니다.
또 다른 예는 _.each/_.map/_.every/_.chain(및 그 이상)이 Collection 프로토타입에 복사되는 Backbone입니다.
다음과 같이 코드 코드를 복사합니다.
// 컬렉션에 구현하려는 밑줄 메서드입니다.
// 백본 컬렉션의 핵심 유용성의 90%가 실제로 구현되었습니다.
// 바로 여기:
var 메소드 = ['forEach', 'each', 'map', 'collect', 'reduce', 'foldl',
'주입', 'reduceRight', 'foldr', '찾기', '감지', '필터', '선택',
'거부', '모두', '모두', '일부', '모두', '포함', '포함', '호출',
'max', 'min', 'toArray', 'size', 'first', 'head', 'take', 'initial', 'rest',
'꼬리', '드롭', '마지막', '없음', '차이', 'indexOf', '셔플',
'lastIndexOf', 'isEmpty', '체인'];
// `Collection#models`에 대한 프록시로 각 Underscore 메소드를 혼합합니다.
_.each(메서드, 함수(메서드) {
Collection.prototype[메소드] = function() {
var args = Slice.call(인수);
args.unshift(this.models);
return _[메서드].apply(_, args);
};
});
또한 _.keys / _.values / _.pairs / _.invert / _.pick과 같은 객체 작업을 위한 실용적인 메서드가 Backbone.Model에 복사됩니다(1.0의 새로운 기능).
다음과 같이 코드 코드를 복사합니다.
var modelMethods = ['키', '값', '쌍', '반전', '선택', '생략'];
// `Model#attributes`에 대한 프록시로 각 Underscore 메소드를 혼합합니다.
_.each(modelMethods, function(메서드) {
Model.prototype[메서드] = function() {
var args = Slice.call(인수);
args.unshift(this.attributes);
return _[메서드].apply(_, args);
};
});