메소드 정의
통화 방법:
구문: call([thisObj[,arg1[, arg2[, [,.argN]]]]])
정의: 현재 객체를 다른 객체로 대체하기 위해 객체의 메소드를 호출합니다.
설명:
호출 메소드는 다른 객체를 대신하여 메소드를 호출하는 데 사용될 수 있습니다. call 메소드는 함수의 객체 컨텍스트를 초기 컨텍스트에서 thisObj가 지정한 새 객체로 변경합니다.
thisObj 매개변수가 제공되지 않으면 Global 개체가 thisObj로 사용됩니다.
신청방법 :
구문: apply([thisObj[,argArray]])
정의: 객체의 메소드를 적용하여 현재 객체를 다른 객체로 대체합니다.
설명:
argArray가 유효한 배열이 아니거나 인수 객체가 아닌 경우 TypeError가 발생합니다.
argArray나 thisObj가 모두 제공되지 않으면 전역 개체가 thisObj로 사용되며 매개 변수를 전달할 수 없습니다.
일반적인 예
아、
function 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 객체에 대한 참조입니다.
b.
function Animal(){ this.name = "Animal"; this.showName = function(){ alert(this.name); } } function Cat(){ this.name = "Cat"; } var animal = new Animal(); var cat = new Cat(); //通过call或apply方法,将原本属于Animal对象的showName()方法交给对象cat来使用了。 //输入结果为"Cat" animal.showName.call(cat,","); //animal.showName.apply(cat,[]);
호출은 원래 cat에 동물의 메소드를 넣어서 실행한다는 의미입니다.
c. 상속 구현
function Animal(name){ this.name = name; this.showName = function(){ alert(this.name); } } function Cat(name){ Animal.call(this, name); } var cat = new Cat("Black Cat"); cat.showName();
d. 다중 상속
function Class10() { 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); }
자바스크립트의 호출 및 적용 메소드는 주로 함수 객체의 컨텍스트, 즉 함수에서 이것이 가리키는 내용을 변경하는 데 사용됩니다.
fun.call(obj1, arg1, arg2, ...); fun.apply(obj2, [arrs]);
var Obj1 = { name: 'Object1', say: function(p1, p2) { console.log(this.name + ' says ' + p1 + ' ' + p2); } }; // logs 'Object1 says Good morning' Obj1.say('Good', 'morning'); var Obj2 = { name: 'Object2' }; // logs 'Object2 says Good afternoon' Obj1.say.call(Obj2, 'Good', 'afternoon'); // logs 'Object2 says Good afternoon again' Obj1.say.apply(Obj2, ['Good', 'afternoon again']);