Rev. 2.73

create 메서드는, 자오브젝트의 initialize 메서드를 호출하는 무명함수를 반환합니다.즉, 이하의 2개는 같은 의미입니다.

var Test = Class.create();

var Test = function() {
  this.initialize.apply(this, arguments);
}

initialize 메서드는 개별적으로 추가할 필요가 있습니다.구체적으로는 이하와 같이 합니다.

var Test = Class.create();
Test.prototype = {
  initialize : function(arg){
    :
    :
  }
}

이것을 참고 사이트 「객체 지향 프로그램 언어로서의 JavaScript」의 기법에 맞추면(자) 이하가 됩니다.

function Test(){
  this.initialize.apply(this, arguments);
}
function Test_initialize(arg){
  :
  :
}
Test.prototype.initialize = Test_initialize;

constructor 인Test 함수가 initialize 메서드에 처리를 환 던지고 하고 있는 것은, 후술 하는 클래스 계승시에 프롭퍼티도 계승시키기 (위해)때문에라고 생각됩니다.(상기 기법에서는 Test 함수내의 프롭퍼티는 계승되지 않는다)

왜 apply()가 사용될까
this.initialize.apply(this, arguments); 의 대체로의 의미는, 「자오브젝트의 initialize 메서드를 호출한다.자오브젝트의 프롭퍼티·메서드를 사용해, 호출원으로부터의인수를 그대로 인수로 한다.」가 됩니다.다만, 자오브젝트의 메서드가, 자오브젝트의 프롭퍼티·메서드를 사용할 수 있는 것은 분명해, 어쩐지 무의미한 지정으로 보입니다.

실제, 제일 인수의 부분은 무의미라고 생각합니다. 이 경우, 중요한 것은 제2 인수 쪽입니다.arguments로 취득한 인수의 배열을, 그대로 함수의 호출에 사용할 수 있기 때문입니다. 이하는 apply()를 사용하지 않았던 경우입니다.

var Class = {
  create: function() {
    return function() {
      //apply()를 사용하지 않고 initialize 메서드를 호출하면(자)···
      this.initialize(arguments); 
    }
  }
}
var Test = Class.create();
Test.prototype = {
  initialize: function(msg) {
    //"[object Object]"라고 표시된다.
    alert(msg);
    
    //"hello!"라고 표시된다.
    alert(msg[0]); 
  }
}
var test = new Test("hello!");

Comments

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

Your Reaction Time!

captcha

avatar