我有一个关于子原型设计的问题。
例如,我想做类似的事情:
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()
,所有子对象都可以访问主对象。
答案 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