Javascript子原型

时间:2014-01-17 16:17:32

标签: javascript prototype

我有一个关于子原型设计的问题。

例如,我想做类似的事情:

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

要访问Bar和Baz中的Foo对象,我使用this.Bar.prototype.Foo = this.Baz.prototype.Foo = this扩展了Bar和Baz的原型。

我的问题是,是否存在更简单的方法来访问Bar和Baz中的主要对象Foo,或者这是通常的方法吗?我想这样做的原因是创建一个主对象var x = new Foo(),所有子对象都可以访问主对象。

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

Foo.prototype.Bar = function() {};
Foo.prototype.Bar.prototype.foo = new Foo();
是的,这正是我大多数时候发现的,但如果我这样走,那么对Foo()的更改就会丢失。

在上面的例子中,我可以将“global”参数设置为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()上更改了“global”参数,那么它应该影响Bar()和Baz()。

我真的不知道这是否是正确的方法,因为我刚开始学习Javascript。我对新想法持开放态度。

此致 强尼

答案 2 :(得分: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

答案 3 :(得分: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