2014-10-15 3 views
0

인스턴스 개체의 개인 상태는 일반적으로 권장되지 않으며 다음 구현의 결함/단점을 지적 해 주시면 감사하겠습니다. 조언/비평은 크게 감사드립니다.인스턴스 개체의 개인 상태 구현 다음과 같은 결함

var namespace = {}; 

namespace.parent = { 
    parent_method1 : function() {}, 
    parent_method2 : function() {} 
}; 


namespace.child = function (properties) { 

    var private="secret"; 

     this.prototype = { 
     create : function() { 
      this.unique = 'base'; 
      this.unique += this.properties; 
        return this.unique; 
     }, 
      get_private: function() { 
       console.log(private); 
      }, 
      set_private: function (val) { 
       private = val; 
      } 
     }; 


    var proto = Object.create(namespace.parent); 
    var instance = Object.create(proto); 
    for (var property in this.prototype) { 
      if (this.prototype.hasOwnProperty(property)) { 
       proto[property] = this.prototype[property]; 
      } 
    } 
     instance.properties = properties; 
    return instance; 
}; 

var a = namespace.child("a"); 
console.log(a.create()); 
a.get_private(); 
a.set_private("new_a_secret"); 
a.get_private(); 

var b = namespace.child("b"); 
console.log(b.create()); 
b.get_private(); 
a.get_private(); 

답변

0

나는 결함/다음 구현의 단점을 지적에서 도움을 주셔서 감사합니다.

var private의 구현에 문제가없는 것으로 나타났습니다.

그러나 코드의 큰 결함은 다음과 같습니다. 이해할 수 없습니다. 당신의 구현이해야 할 일은 무엇입니까? 그것은 표준 패턴을 따르지 않습니다. 이는 의사 메소드의 단점 일 수 있으며 실제 모델을 구현할 때 정리할 수 있습니다. 그러나 그것은 혼란 스럽습니다. 일부 문서 주석도 도움이 될 것입니다.

특히 :

  • namespace.child은 무엇입니까? 그것은 공장 기능처럼 보이지만, 나는 그것이 생산하는 "차일 즈"이 무엇인지 확실하지 않습니다.
  • 또한 어떤 이유에서 모든 호출시 namespace.prototype 속성을 새 개체에 설정 한 다음 instance 개체proto 개체로 혼합합니다. 그러나 전역 범위에서 마지막으로 만들어진 인스턴스의 내부 (get_private, set_private)를 남겨 둡니다.
  • ab은 수업으로 간주됩니까? 왜 그들은 .create() 메쏘드를 가지며 클래스를 초기화합니까? (인스턴스?) - 그렇다면 .init()이라고해야합니다. .unique 속성 값을 반환하는 이유는 무엇입니까?
  • child 메서드는 해당 요소를 즉시 초기화하지 못합니다.
  • .properties 문자열 값을 보유하고있는 필드는 무엇입니까?
  • instance 개체에 대해 2 단계 상속을 사용하고 있습니까? Object.create(namespace.parent)은 이해할 수 있지만 공유되는 정적 객체를 상속합니다. 그렇다면 은 proto의 일부 속성 (create, get_private, set_private)과 instance의 일부 속성 (properties, unique)을 복사하는 이유는 무엇입니까? 왜 그들을 구별합니까?
+0

그렇다면'a'도'b'도 인스턴스화 할 수 없으므로 작동하지 않습니다. – Bergi

+0

namespace.child는 클래스를 생성하는 팩토리 함수로 간주됩니다. init()은 초기화 함수의 이름을 짓는 더 좋은 방법입니다. .unique는 .properties를 기반으로 한 고유 한 것을 리턴한다는 것을 보여주기 위해 사용되었습니다 (문자열을 저장하는 것은 단지 예일뿐입니다). get_private, set_private 및 create (well init)는 각 클래스 인스턴스 (parent_method1 및 parent_method2 포함)간에 공유되어야한다고 가정합니다. 제안 된대로 상속 수준에 따라 팩터링 된 클래스에 대해 공유되도록하는 더 좋은 방법입니다. ? – humand

+0

문제는 'create'(또는'init')가 클래스 * 인스턴스를 만드는 대신 클래스 자체를 실제로 초기화한다는 것입니다. "* 각 클래스 인스턴스간에 공유 *"라는 용어는 모호합니다. 클래스 객체 또는 인스턴스 객체를 의미합니까? – Bergi