용법 1(공용):
표현식은 object.method.call(또 다른 객체)이며, 이는 현재 객체를 다른 객체로 대체하고 현재 객체의 메소드를 실행한다는 의미입니다. 먼저 예를 살펴보겠습니다.
c1.showName.call(c2);
c2.showName(); //실행할 수 없습니다.
먼저 Class1과 Class2라는 두 가지 함수를 정의했습니다. 두 함수의 주요 차이점은 Class2에 Class1보다 showName() 메서드가 하나 더 있다는 것입니다. 그러면 Class1과 Class2에 해당하는 객체 c1과 c2가 정의됩니다. 이때 c1에는 showName() 메서드가 있지만 c2에는 없다는 것을 분명히 알 수 있습니다. 그런데 c1.shoName.call(c2)을 실행하면 c2의 이름 값인 "class2"가 나타납니다. 사실, 우리는 여전히 c1의 메소드를 실행하고 있지만, 단지 일시적으로 객체 c2를 객체 c1로 대체했을 뿐입니다. 실행 후에도 여전히 정의되었을 때와 동일하며, c2에는 더 이상 메소드가 없습니다. c2에 더 많은 메소드가 있는지 감지하기 위해 예제에서는 c2.showNmae(); 실행할 수 없으며 브라우저는 Object #
왜 이러는 걸까요? 앞서 언급했듯이 이는 일시적인 사용 방법이므로 효율적인 프로그래밍을 위해 사용합니다. 그러나 이에 제한이 없는 것은 아니다. 대체 객체와 대체 객체를 표현하기 위해 c1과 c2를 사용하고, c1의 고유 메소드를 표현하기 위해 fun1을 사용한다고 가정하자. 1. fun1에 매개변수가 필요하지 않고 상위 함수에서 지역 변수를 사용하지 않는 경우 c1.fun1.call(c2)와 c1.fun1() 사이에는 실제로 차이가 없습니다. 2. fun1에 매개변수가 필요하지 않지만; in에서 상위 함수 변수를 사용하는 경우 c1 및 c2의 함수에서 동일한 이름으로 fun1에서 사용하는 변수를 생성해야 합니다. 3. fun1에 매개변수가 필요한 경우 양식을 c1.fun1.call(c2)로 다시 작성해야 합니다. , 매개변수 1, 매개변수 2, ...매개변수 n) 이때, c1을 생성하는 함수의 변수 이름은 c2를 생성하는 함수의 변수 이름과 같을 필요는 없고, 해당합니다. 실제로 call을 사용할 때 c2와 c1은 구조와 기능면에서 큰 유사성을 갖는 경우가 많기 때문에 위의 세 가지 사항을 피하기 쉽습니다.
용법 2:
함수 정의 프로세스에서 다른 기존 함수.call(this)의 형식으로 사용됩니다. 이는 다른 기존 함수의 모든 변수와 메서드를 자체 함수로 복제하여 유사한 상속 기능을 달성할 수 있습니다. 예를 들어보세요:
var 동물 = new Animal("small_animal");
animal.showName() //alert("small_animal")
function Cat(이름){
Animal.call(이, 이름);
};
//var Animal = null; //주석을 제거하고 시도해 보세요
var cat = new Cat("black_cat");
cat.showName() //alert("black_cat")