인스턴스화된 객체를 사용하여 JavaScript에서 네임스페이스를 제공하는 방법

StackOverflow https://stackoverflow.com/questions/22976

  •  09-06-2019
  •  | 
  •  

문제

다음과 같은 방식으로 작성된 JavaScript "객체"가 있습니다.

function foo()
{
    this.length = 0;
}

foo.prototype.getLength = function()
{
    return this.length;
}

...

싱글톤 JavaScript 개체로 네임스페이스를 에뮬레이트하는 방법을 알고 있지만 위와 같이 인스턴스화되는 개체를 "네임페이스"하는 가장 좋은 방법은 무엇입니까?

여러 JavaScript 라이브러리에 네임페이싱 기능이 있다는 것을 알고 있지만 jQuery를 사용하고 있으며 믹스에 다른 라이브러리를 추가하고 싶지 않습니다.나는 인스턴스화해야 하는 내 JS 객체에 대해 고유한 네임스페이스 스키마인 jQuery를 활용하여 내 자신의 네임스페이스를 제공하고 싶습니다.

감사합니다 RP

도움이 되었습니까?

해결책

단순한:

if(!MyNamespace) MyNamespace = {};

MyNamespace.foo = function() {
   this.length = 0;
};
MyNamespace.foo.prototype.getLength = function() {
   return this.length;
};

다른 팁

Javascript에는 실제로 다른 언어처럼 네임스페이스나 패키지가 없습니다.대신 클로저가 있습니다.여러 함수, 변수 및 개체로 구성된 애플리케이션이 있는 경우 이를 단일 전역 개체 안에 넣어야 합니다.이는 네임스페이스와 동일한 효과를 갖습니다.

예를 들어:

var namespace = {
  this.foo: function(){
    ...
  },
  this.foo.prototype.getLength: function(){
    ...
  }
}

중첩된 객체 세트를 생성하고 패키지를 시뮬레이션할 수도 있습니다.

loadPackage = function(){
  var path = arguments[0];
  for(var i=1; i<arguments.length; i++){
    if(!path[arguments[i]]){
      path[arguments[i]] = {};
    }
    path = path[arguments[i]];
  }
  return path;
}

loadPackage(this, "com", "google", "mail") = {
  username: "gundersen",
  login: function(password){
    ...
  }
}
this.com.google.mail.login("mySecretPassword");

크게 다르지 않아야 합니다.

namespace.foo = function foo() {...}
namespace.foo.prototype.getLength = function() { ... }

아니면 당신은 사용할 수 있습니다

(function() {
  function foo() { ... }
  foo.prototype...
  namespace.foo = foo;
})();

타이핑을 절약하기 위해.

두 답변 모두 매우 도움이 되었습니다!내가 끝낸 내용은 다음과 같습니다.

if( typeof( rpNameSpace ) == "undefined" ) rpNameSpace = {};

rpNameSpace.foo = function() {
    this.length = 613;
}
rpNameSpace.foo.prototype.getLength = function() {
    return this.length * 2;
}

그런 다음 결과 "네임스페이스" 개체를 사용하려면 다음을 수행합니다.

var x = new rpNameSpace.foo()

display( x.getLength() );

또 다른 대안은 다음과 같습니다. bob.js 뼈대:

bob.ns.setNs('myApp.myFunctions', { 
    say: function(msg) {  
        console.log(msg); 
    } 
}); 

//sub-namespace
bob.ns.setNs('myApp.myFunctions.mySubFunctions', { 
    hello: function(name) { 
        myApp.myFunctions.say('Hello, ' + name); 
    } 
}); 

//call:
myApp.myFunctions.mySubFunctions.hello('Bob'); 
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top