подобъекты javascript и шаблоны определения - PullRequest
1 голос
/ 12 июня 2011

Я уже некоторое время размышляю над этим и задаюсь вопросом, может ли кто-нибудь указать мне правильное направление.

У меня есть следующее определение объекта:

var foo=function(){};
foo.prototype={
  foo1:function(){},
  baz:{
    baz1:function(){}
  },
  bar:function(){
    function privateFunc1(){}
    function privateFunc2(){}
    return {
      bar1:function(){
        //do something using privateFunc1
        //return the result
      }
    };
  }
};

var foobar = new foo();

Теперь, чтобы получить доступ к под-методу baz1 метода baz, я могу сделать foobar.baz.baz1()
Но чтобы получить доступ к под-методу bar1 метода bar, мне нужно сделать foobar.bar().bar1() ( Обратите внимание на дополнительные символы после bar)

Есть ли способ определения объекта foo, чтобы я мог позвонить bar1, используя foobar.bar.bar1() ( Обратите внимание, без лишних скобок ), Но все еще сохраняют использование приватных функций privateFunc1 и privateFunc2 в методе bar.

Также обратите внимание, что я не могу сделать bar самовыполняющейся функцией, поскольку она зависит от изменяемых свойств объекта foo, которые могут измениться после самовыполнения функции.

Надеюсь, вопрос был достаточно ясен ... заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 12 июня 2011

Это может идти в нужном вам направлении. http://jsfiddle.net/Una9k/1/

var Foo = function() {
    this.mutableProperty = "mutable";
    this.bar = new Foo.prototype.Bar(this);
};
Foo.prototype = {
    constructor: Foo,
    Bar:function(context){
        var ctx = context;
        function privateFunc(){
            alert(ctx.mutableProperty);
        }
        return {
            bar1: function () {
                privateFunc();    
            }
        };
    }
};

var foobar = new Foo();
foobar.bar.bar1(); // alerts 'mutable'

foobar.mutableProperty = "changed";
foobar.bar.bar1(); // alerts 'changed'
1 голос
/ 12 июня 2011

Если есть возможность немедленно вызвать foobar.bar ():

function createFooBar() {
   //return foobar   
   var foobar = {
      foo1: function() {},
      baz: {
          baz1: function(){}
      },
      bar: function(){
          function privateFunc1(){}
          function privateFunc2(){}
          return {
              bar1:function(){
                 //do something using privateFunc1
                 //return the result
              }
          }
      }()
   };


   return foobar;
};
// now you have foobar.bar.bar1()
1 голос
/ 12 июня 2011

Возможно, это может сработать ...

function createFooBar() {
   //return foobar   
   var foobar = {
      foo1: function() {},
      baz: {
          baz1: function(){}
      },
      bar: function(){
          function privateFunc1(){}
          function privateFunc2(){}
          return {
              bar1:function(){
                 //do something using privateFunc1
                 //return the result
              }
          }
      }
   };

   foobar.bar.bar1 = foobar.bar();

   return foobar;
};

var foobar = createFoobar();

Используя вышеописанное, вы также можете разместить свои функции в функции createFooBar. Итак, после всего вышесказанного ...

createFooBar.foo1 = function(){} //and so on...

тогда в функции createFooBar вы можете ссылаться на foo1 следующим образом ...

//code in the beginning...
var foobar = {
    foo1: createFooBar.foo1,
//and so on...

Кроме того, вы также можете просто создать функцию create для текущей функции foo ...

foo.create = function() {
    var fooBar = new Foo();
    fooBar.bar.bar1 = fooBar.bar();
    return fooBar;
}

var fooBar = foo.create();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...