2010-12-07 3 views
1

Я создаю литерал объекта, который я использую как пространство имен. Объектный литерал (пространство имен) содержит конструкторскую функцию MyConstructor. Я хочу расширить прототип MyConstructor внутри литерала объекта. Если я вытащил объявление для MyConstructor и разместил его над объявлением myNamespace, все будет хорошо, за исключением того, что MyConstructor больше не помещается в пространство имен myNamespace. Как лучше всего сделать эту работу? Следующие не скомпилируются, потому что
. в этой строке:Объявление прототипа внутри объекта Literal

MyConstructor.prototype = { 

Объект буквальный, указанный ниже.

Спасибо, Майк

var myNamespace = { 
    a: 3, 
    b: function (msg) { 
     alert(this.a); 
    }, 
    MyConstructor: function(xx) { 
     this.x = xx; 
    }, 
    MyConstructor.prototype = { 
     a: 1, 
     b: function() { 
      return true; 
     } 
    } 
}; 

Обновление: принято решение работает. Однако сама посылка моего вопроса была ошибочной. Я бы не использовал объектный литерал вообще в этой ситуации, потому что сложнее провести тестирование, как я узнал. Вместо этого я бы использовал обычный объект, созданный с помощью конструктора, и помещал в него частные объекты. Другое дело, что функция «сам/немедленно выполняю», хотя и красива в некотором роде, немного сложнее объяснить новичкам.

ответ

5

Вы просто не можете сделать это в объектном литерале. Сожалею.

Что касается способа обойти его, используйте функцию для создания myNamespace. Таким образом, он не должен быть буквальным, но вы все еще можете получить эффект пространства имен:

var myNamespace = (function(){ 

    var ns = { 
    a: 3, 
    b: function (msg) { 
     alert(this.a); 
    }, 
    MyConstructor: function(xx) { 
     this.x = xx; 
    } 
    }; 

    ns.MyConstructor.prototype = { 
    a: 1, 
    b: function() { 
     return true; 
    } 

    return ns; 
}()); 

Так что здесь происходит, что myNamespace устанавливается на значение функции, которая вызывается немедленно и возвращает фактический объект пространства имен, который вы используете. Никакой другой код не может получить доступ к тому, что находится в функции, но поскольку он находится внутри функции, вы можете делать что-либо, а не только литералы объектов. Который решает вашу проблему;)

+0

Вы и meouw были оба правильными, и вы оба отвечали в режиме реального времени, но я мог выбрать только один из ваших ответов. Спасибо вам обоим. – Mike 2010-12-08 13:50:18

5

Просто используйте пространство имен

var myNamespace = { 
    myConstructor: function(x) { 
     this.x = x; 
    } 
} 

myNamespace.myConstructor.prototype = { 
    //... 
} 

Или другой вариант

var myNamespace = (function(){ 

    function myConstructor(){} 

    myConstructor.prototype = {}; 

    return { 
     myConstructor: myConstructor 
    } 

})(); 
+0

Aw, это, конечно, самый простой способ :) Мой способ, с функцией, все еще можно использовать, если идет сложный hing, который должен быть скрыт, но это, очевидно, более прямое решение. – Jakob 2010-12-07 22:48:45

0

Как насчет создать функцию генератора, которая возвращает свой MyConstructor. Если вы создадите функцию createMyConstructor, немедленно вызовите ее, она вернет вам то, что вы хотите.

var myNamespace = { 
    a: 3, 
    b: function (msg) { 
     alert(this.a); 
    }, 
    MyConstructor: (function createMyConstructor() { 
     var cons = function(xx) { 
      this.x = xx; 
     }; 
     cons.prototype = { 
      a: 1, 
      b: function() { 
       return true; 
     }; 
     return cons; 
    })() 
}; 
Смежные вопросы