Learning Javascript OOP II

  • 작용역, 끼워넣기 함수와 패키지 닫기
  • 진정한 사유 방법과 속성: 자바스크립트에서는 함수만 작용역이 있다.함수 내부에서 성명된 변수가 함수 밖에서 접근할 수 없다는 뜻이다.그러나 이 함수에 정의된 변수는 이 함수에 내장될 수 있습니다.그래서 이렇게 하면 사유 방법과 속성의 효과에 도달할 수 있다
    function foo() {
       var i = 2;
    
       // private function
       function bar() {
          i *= 2;
       }
    
       bar();
       return i;
    }
    
     
    
    function foo() {
       var i = 2;
    
       // private function
       function bar() {
          i *= 2;
          return i;
       }
    
       return bar();
    }
    var baz = foo(); // baz is now a reference to function bar.
    baz(); // returns 4
    baz(); // returns 8
    baz(); // returns 16
    
    var blat = foo(); // blat is another reference to bar.
    blat(); // return 4
     

  • 언제 구조 함수에 방법을 정의해야 하는가(특권 방법Privileged methods):
    var Persion = function(name, age) {
       var name;
       
       this.setName(nameParam) {
          name = nameParam;
       }
    }
    언제 프로토타입 방식으로 방법을 정의해야 하는지:
    var Person = function(name, age) {
       var name;
       var age;
    
       this.getName() {
          return name;
       }
    
       this.getAge() {
          return age;
       }
    
    };
    
    Person.prototype = function() {
       toString : function() {
          return this.getName() + " is " + this.getAge() + " years old."
       }
    }
    프로토타입 정의 방법은 개인 변수와 방법에 접근할 수 없고 프로토타입 정의 방법은 메모리에 한 개만 존재하며 특권 방법인 Privileged methods는 여러 개의 실례를 만든 후 메모리에 여러 개가 존재하여 성능을 떨어뜨린다.또한 사유 속성과 방법은 이불류로 중용할 수 없기 때문에 자류에서 방법이나 속성을 중용할 때 방법과 속성에 대한 작용역 제한은 폐쇄로 실현할 수 없다
  • 완전한 JS류의 예(패키지 채택 방식 실현)
    var Person = (function(){
       
       // const variable(This variable won't be changed, so it's final.)
       var EIGHTEEN = 18;
    
       // private static variable
       var personCount = 0;
    
       // private static method
       function isAdult(age) {
          return age >= EIGHTEEN ? true : false;
       }
    
       // constructor
       return function(nameParam, ageParam) {
          // private instance variable
          var name, age;
    
          // public instance method(Privileged method)
          this.setName = function(nameParam) {
             name = nameParam;
          };
          this.getName = function() {
             return name;
          };
          this.setAge = function(ageParam) {
             if (isAdult(ageParam)) {
                age = ageParam;
             }
             age = EIGHTEEN;
          };
          this.getAge = function() {
             return age;
          };
    
          // init properties or do some about initializing work
          personCount++;
    
          this.setName(nameParam);
          this.setAge(ageParam);
       }
    })();
    
    // public static method for Person class
    Person.doSomething = function() {
       //TODO......
    };
    
    // Create Person instance
    Person handy_wang = new Person("handy.wang", 18);
    handy_wang.setName("Wang-Jiangshan");
    handy_wang.setAge(24);
    Person.doSomething();
     
  • 좋은 웹페이지 즐겨찾기