Я только начинаю работать с Javascript, поэтому моя первая попытка использовать пространства имен выглядела так:
var myNameSpace = {};
var myNameSpaceProto = myNameSpace.__proto__;
myNameSpaceProto.SomeFunc = function()
{
alert("SomeFunc()");
};
myNameSpaceProto.SomeObject = function()
{
alert("SomeObject constructor");
};
var instance = new myNameSpace.SomeObject();
Я полагаю, что могу смело пропустить шаг прототипа и просто иметь myNameSpace.SomeFunc = function..., потому что существует только один экземпляр объекта myNameSpace, поэтому прототип ничего не сохраняет.
Вопрос 1. Это правильно? Я хочу добавить в пространство имен из нескольких отдельных файлов .js, поэтому этот способ кажется удобным.
Вопрос 2. В приведенном выше фрагменте кода я обнаружил странный побочный эффект загрязнения пространства имен, который показан следующим телом SomeObject:
myNameSpaceProto.SomeObject = function()
{
// As expected NonexistantFunc is not a member of this and returns "undefined"
alert("typeof this.NonexistantFunc = " + typeof this.NonexistantFunc);
// Returns 'function'. How has SomeFunc made it to this.SomeFunc? It's supposed to be under myNameSpace.SomeFunc
alert("typeof this.SomeFunc = " + typeof this.SomeFunc);
// Turns out it's in the prototype's prototype. Why?
alert("this.__proto__.__proto__.SomeFunc = " + this.__proto__.__proto__.SomeFunc);
};
Это было проверено на Chrome 8, и я не могу понять, как SomeObject стал участником SomeFunc. Кажется, это пробел в моих ограниченных знаниях о прототипах. Может кто-нибудь объяснить?