2014-01-17 2 views
5

У меня есть вопрос о суб-прототипировании.Javascript sub prototyping

В качестве примера я хочу сделать что-то вроде:

var Foo = function() { this.Bar.prototype.Foo = this.Baz.prototype.Foo = this }; 
Foo.prototype.is = "foo"; 
Foo.prototype.Iam = function() { return this.is }; 

Foo.prototype.Bar = function() {}; 
Foo.prototype.Bar.prototype.is = "bar"; 
Foo.prototype.Bar.prototype.Iam = function() { return this.Foo.is + this.is }; 

Foo.prototype.Baz = function() {}; 
Foo.prototype.Baz.prototype.is = "baz"; 
Foo.prototype.Baz.prototype.Iam = function() { return this.Foo.is + this.is }; 

var foo = new Foo(); 
var bar = new foo.Bar(); 
var baz = new foo.Baz(); 

console.log(foo.Iam()); // output: foo 
console.log(bar.Iam()); // output: foobar 
console.log(baz.Iam()); // output: foobaz 

Чтобы получить доступ к Foo-объект в баре и Баз я продлить прототип бара и Баз с this.Bar.prototype.Foo = this.Baz.prototype.Foo = this.

Мой вопрос в том, существует ли более простой способ сделать это и получить доступ к основному объекту Foo в пределах Bar и Baz, или это обычный способ сделать это? Причина, по которой я хочу сделать это, - создать один основной объект var x = new Foo(), и все вспомогательные объекты могут получить доступ к основному объекту.

+0

Ваш текущий метод кажется довольно приличным - примерно 1 оператор за класс вводит его в микс. – goat

+4

Является ли это «вспомогательным прототипом» фактического шаблона, который фактически используется некоторыми людьми? – basilikum

+1

Я не вижу причин для прототипа Bar или Baz, которые являются конструктором функций. Я записал свой вариант, включив Bar и Baz в Foo – Andrew

ответ

0

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

var Foo = function() {}; 
Foo.prototype.is = "foo"; 
Foo.prototype.Iam = function() { return this.is }; 

Foo.prototype.Bar = function() {}; 
Foo.prototype.Bar.prototype.foo = new Foo(); 
Foo.prototype.Bar.prototype.is = "bar"; 
Foo.prototype.Bar.prototype.Iam = function() { return this.foo.is + this.is }; 

Foo.prototype.Baz = function() {}; 
Foo.prototype.Baz.prototype.foo = new Foo(); 
Foo.prototype.Baz.prototype.is = "baz"; 
Foo.prototype.Baz.prototype.Iam = function() { return this.foo.is + this.is }; 

var foo = new Foo(); 
var bar = new foo.Bar(); 
var baz = new foo.Baz(); 

console.log(foo.Iam()); // output: foo 
console.log(bar.Iam()); // output: foobar 
console.log(baz.Iam()); // output: foobaz 
0
Foo.prototype.Bar = function() {}; 
Foo.prototype.Bar.prototype.foo = new Foo(); 

да, это именно то, что я нашел в большинстве случаев, но если я идти этим путем, то изменения в Foo() теряются.

В моем примере выше я могу установить «глобальные» параметры для Foo(), которые доступны из Bar() и Baz(). Пример:

var extend = function(a, b) { 
    var n; 
    for (n in b) { 
     a[n] = b[n]; 
    } 
}; 

var Foo = function(o) { 
    extend(this, o); 
    this.Bar.prototype.Foo = this.Baz.prototype.Foo = this; 
}; 

Foo.prototype.is = "foo"; 
Foo.prototype.Iam = function() { return this.is }; 
Foo.prototype.greeting = "hello, I am"; 

Foo.prototype.Bar = function() {}; 
Foo.prototype.Bar.prototype.is = "bar"; 
Foo.prototype.Bar.prototype.Iam = function() { return this.Foo.greeting +" "+ this.Foo.is + this.is }; 

Foo.prototype.Baz = function() {}; 
Foo.prototype.Baz.prototype.is = "baz"; 
Foo.prototype.Baz.prototype.Iam = function() { return this.Foo.is + this.is }; 

var foo = new Foo({ greeting: "hi my friend, I am" }); 
var bar = new foo.Bar(); 
console.log(bar.Iam()); 

//output is: hi my friend, I am foobar 

Я установил приветствие Foo(), доступное из всех вспомогательных функций. Причиной этого было то, что существуют разные «глобальные» параметры объекта. Если в Foo() изменяется «глобальный» параметр, это должно повлиять на Bar() и Baz().

Я действительно не знаю, правильно ли это, потому что я только начал изучать Javascript. Я открыт для новых идей.

С уважением, Jonny

0

Может быть, вот что вы ищете:

var extend = function(a, b) { 
    var n; 
    for (n in b) { 
     a[n] = b[n]; 
    } 
}; 

var Foo = function(o) { 
    extend(this, o); 
    var foo = this; 

    this.Bar = function() {}; 
    this.Bar.prototype.is = "bar"; 
    this.Bar.prototype.Iam = function() { return foo.is + this.is }; 

    this.Baz = function() {}; 
    this.Baz.prototype.is = "baz"; 
    this.Baz.prototype.Iam = function() { return foo.is + this.is }; 
}; 
Foo.prototype.is = "foo"; 
Foo.prototype.Iam = function() { return this.is }; 

var foo = new Foo({ is: "foo2" }); 
var bar = new foo.Bar(); 
var baz = new foo.Baz(); 

console.log(foo.Iam()); // output: foo2 
console.log(bar.Iam()); // output: foo2bar 
console.log(baz.Iam()); // output: foo2baz 
0

Существует только один экземпляр Foo, так что вы можете объявить Foo как литерал объекта:

var foo = { 
    is:"foo", 
    Iam:function(){return this.is} 
}; 

foo.Bar = function() {}; 
foo.Bar.prototype.is = "bar"; 

foo.Baz = function() {}; 
foo.Baz.prototype.is = "baz"; 

foo.Bar.prototype.Iam = foo.Baz.prototype.Iam 
    = function() { return foo.is + this.is }; 

var bar = new foo.Bar(); 
var baz = new foo.Baz(); 

console.log(foo.Iam()); // output: foo 
console.log(bar.Iam()); // output: foobar 
console.log(baz.Iam()); // output: foobaz 
Смежные вопросы