Кроме пространств имен, мне не совсем понятно, что вы пытаетесь сделать, но я включил своего рода обзор кода под разделителем ниже.Сначала более высокоуровневые комментарии.
Здесь есть несколько проблем.Во-первых, вы почти никогда не хотите писать new function() { }
.Это очень продвинутый метод, который легко ошибиться (и очень легко для любого, кто занимается обслуживанием кода, неправильно его понять).Ниже приведен пример другого, менее запутанного способа получения того же эффекта (плюс некоторые другие преимущества).
Вот пример модуля с пространством имен, предоставляющего два "класса", Cat
и Lion
(Я сделал их изначально ограниченными, потому что это обычное соглашение: начальные заглавные буквы для функций конструктора и начальные строчные буквы для неструктурных функций, просто для облегчения чтения кода):
var Animals = (function() {
var publics = {};
// A Cat
publics.Cat = Cat;
function Cat() {
this.eyes = 2;
this.legs = 4;
this.diet = 'carnivore';
}
// A Lion
publics.Lion = Lion;
function Lion() {
this.mane = true;
this.origin = 'Africa';
this.diet = 'people'; // has priority over cat's diet
}
Lion.prototype = new Cat();
// Return our public symbols
return publics;
})();
// Usage
var l = new Animals.Lion();
alert(l.eyes); // alerts "2" (inherited from Cat)
alert(l.diet); // alerts "people" (overridden by Lion)
(Выможет, конечно, вызывать publics
что угодно, что угодно - pubs
, p
, что угодно. Это эквивалент this
во внешнем слое вашей new function() { }
функции, но менее запутанно.)
Но просто заменить прототип на Lion
немного проще.Когда вы начинаете переходить на подклассы, есть несколько других вещей, на которые вы хотите посмотреть. Вот запись в блоге , в которой подробно описаны достаточно полные способы построения классов, включая создание подклассов, вызов функций суперкласса и т. Д.
С точки зрения поиска чего-либо по строке, вы можете сделать это с помощью скобокобозначение любого объекта:
var obj = {};
obj.foo = 42;
alert(obj["foo"]); // alerts "42" by retrieving the property "foo" from `obj`
var x = "f" + "o" + "o";
alert(obj[x]); // alerts "42" by retrieving the property "foo" from `obj`
Ниже приведен обзор кода.
Вот обзор кода:
// Namespace all my code
// [TJC] Use the (function() { ... })(); mechanism described above rather than
// `new function() { ... }`, which is fairly confusing to the reader and troublesome
// to use inside inner functions (see below)
var bab = new function() {
// Declare cat object
// [TJC] Convention is to use initial caps for constructor functions,
// e.g. "Cat" not "cat"
function cat()
{
this.eyes = 2;
this.legs = 4;
this.diet = 'carnivore';
// [TJC] Don't return anything out of constructor functions
return true;
}
// Declare lion object
// [TJC] "Lion" rather than "lion" would be more conventional
function lion()
{
this.mane = true;
this.origin = 'Africa';
this.diet = 'people'; // has priority over cat's diet
// [TJC] Don't return anything out of constructor functions
return true;
}
// Make lion a subclass of cat
// [TJC] There are several other things you want to consider in
// addition to replacing the prototype
lion.prototype = new cat();
// Create an instance of class lion
// [TJC] From your usage below, it looks like you
// want to be able to look up "simba" using a string
// later. So use the below rather than this commented-out
// line:
//var simba = new lion();
var instances = {}; // [TJC]
instances.simba = new lion(); // [TJC]
// Share diet publicly
// [TJC] You don't need a function for this at all, just
// expose "instances" directly. But if you want it:
this.objInfo = function(name) {
// [TJC] To look up something by name using a string,
// use brackets:
//return name; // simba works, name doesn't
return instances[name]; // [TJC]
};
};
alert(bab.objInfo('simba').diet);