호출 및 적용 메서드 호출 메서드는 이 포인터의 컨텍스트를 변경할 수 있습니다. 유사한 메서드에는 현재 this 인스턴스 포인터를 일관되게 유지하기 위해 js 개체의 다양한 메서드가 서로 호출할 때 주로 사용되는 적용이 포함됩니다. 또는 특별한 경우에는 this 포인터를 변경해야 합니다. 구체적인 예를 들어보세요
함수 add(a , b) {
alert(a b);
}
function sub(a, b) {
alert(a - b)
}
add.call (sub, 3, 1);
이 예의 의미는 sub를 add, add.call(sub,3,1) == add(3,1)로 바꾸는 것입니다. 결과는 다음과 같습니다. Alert(4); // 참고: js의 함수는 실제로 객체이며 함수 이름은 Function 객체에 대한 참조입니다.
조금 더 복잡한 예를 보세요
function Class1 () {
this.name = "class1";
this.showNam = function() {
alert(this.name)
}
}
function Class2() {
this.name = "class2";
}
var c1 = new Class1()
var c2 = new Class2() ;
c1.showNam.call(c2);
c2에 c1의 메소드를 넣어 실행한다는 뜻입니다. 이제 c1의 메소드를 넣는 것입니다. showNam() 메소드는 실행을 위해 c2에 배치되므로 this.name은 class2여야 하며 실행 결과는 다음과 같습니다. 호출을 사용하여 상속을 구현할 수 있습니다
this.showTxt = function(txt) {
alert(txt)
}
}
function Class2() {
Class1.call(this );
}
var c2 = new Class2() ;
c2.showTxt("cc")
이런 식으로 Class2는 Class1.Class1.call(this)은 이 객체 대신 Class1 객체를 사용한다는 의미이며, Class2는 Class1의 모든 속성과 메소드를 가지고 있지 않습니까? c2 객체는 Class1의 메소드와 속성을 직접 호출할 수 있습니다. : Alert ("cc");
이것은 javaScript가 객체 지향 상속을 시뮬레이션하는 방법이며 다중 상속도 달성할 수 있습니다.
this .showSub = function(a, b) {
alert(a - b);
}
}
function Class11() {
this.showAdd = function(a, b) {
alert(a b);
}
}
function Class2() {
Class10.call(this)
Class11.call(this);
}
1.call 메소드
객체의 메소드를 호출하여 현재 객체를 다른 객체로 대체합니다.
call([thisObj[,arg1[, arg2[, [,.argN]]]]])
매개변수 thisObj는 선택 사항입니다. 현재 객체로 사용될 객체입니다.
arg1, arg2, , argN은 선택 사항입니다. 일련의 메소드 매개변수가 전달됩니다.
2.메소드 적용
특정 객체의 메소드를 적용하고 현재 객체를 다른 객체로 교체합니다.
apply([thisObj[,argArray]])
매개변수 thisObj 선택 사항입니다. 현재 객체로 사용될 객체입니다.
argArray 선택사항. 이 함수에 전달될 인수 배열입니다.
둘의 차이점
:
둘이 구현하는 기능은 완전히 동일하지만, Call은 각 매개변수를 쉼표(,)로 구분합니다. 그리고 적용은 모든 매개변수를 배열로 전달하는 것입니다.