Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/445.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Javascript中跨对象组共享属性_Javascript_Inheritance_Behavior - Fatal编程技术网

在Javascript中跨对象组共享属性

在Javascript中跨对象组共享属性,javascript,inheritance,behavior,Javascript,Inheritance,Behavior,在javascript中,如果我需要每个对象都有一个单独的属性值,我可以在构造函数中设置它,如下所示: function A(x) { this.a = x; } 如果我想在对象之间共享某个属性,我可以在构造函数的原型中设置它 function B() {} B.prototype.b = 'B0'; 但在这两种情况之间该怎么办呢?基本上,我有一个现有的代码,其中所有构造的对象都从原型继承一个属性,但现在我需要将它们分成几个组,以便组中的所有成员共享一个属性 有什么方法可以专门化构造

在javascript中,如果我需要每个对象都有一个单独的属性值,我可以在构造函数中设置它,如下所示:

function A(x) {
    this.a = x;
}
如果我想在对象之间共享某个属性,我可以在构造函数的原型中设置它

function B() {}
B.prototype.b = 'B0';
但在这两种情况之间该怎么办呢?基本上,我有一个现有的代码,其中所有构造的对象都从原型继承一个属性,但现在我需要将它们分成几个组,以便组中的所有成员共享一个属性


有什么方法可以专门化构造函数B吗?

B.prototype.B
不会像您假定的那样创建静态属性。更复杂的是,附加到原型的属性与其他实例共享其值,直到它们覆盖该值,这意味着:

var Foo = function(){
};
Foo.prototype.bar = 'bar';

var f1 = new Foo();
console.log( f1.bar ); //outputs 'bar'
var f2 = new Foo();
console.log( f2.bar ); //outputs 'bar'

f2.bar = 'notbar';
console.log( f2.bar ); //outputs 'notbar'
console.log( f1.bar ); //outputs 'bar'
拥有“真实”静态属性的唯一方法是将它们附加到构造函数本身:

Foo.bar2 = 'bar2';
Foo
的实例必须使用
Foo.bar2
访问该值

因此,您的问题的答案是为每个组创建“子类”(从基构造函数继承原型的构造函数),并为每个子类附加一个属性,如下所示:

var Base = function(){
};
Base.prototype.getSomething = function(){
    return this.constructor.something;
};
Base.prototype.setSomething = function( value ){
    this.constructor.something = value;
}
var Group1 = function(){
};
Group1.prototype = new Base(); //classical inheritance
Group1.prototype.constructor = Group1;
Group1.something = 'something';
var Group2 = function(){
};
Group2.prototype = new Base(); //classical inheritance
Group2.prototype.constructor = Group2;
Group2.something = 'something else';

var g1a = new Group1();
var g1b = new Group1();
var g2a = new Group2();
var g2b = new Group2();

g1a.setSomething( 'whatever' );

console.log( g1a.getSomething() ); //outputs 'whatever'
console.log( g1b.getSomething() ); //outputs 'whatever'
console.log( g2a.getSomething() ); //outputs 'something else'
console.log( g2b.getSomething() ); //outputs 'something else'
警告:
Group1.prototype=newbase()
实际上是一种不好的做法,几天前我写了一篇关于3种继承类型的博客文章,这解释了为什么:


太好了!但是如果我的构造函数真的有参数呢?你到底是什么意思?Group1和Group2是可以有参数的普通构造函数。如果他们需要调用超级构造函数,他们可以像这样直接调用:
Base.call(this)”,或者你可以像我的博客文章中那样执行
\uuuuuuuuuuuuuuuuuuuuuuuuuu`技巧。