在 Javascript 中的对象组之间共享属性
sharing attributes across groups of objects in Javascript
在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 = new Base();
实际上是不好的做法,几天前我写了一篇关于 3 种继承类型的博客文章,解释了原因:
http://creynders.wordpress.com/2012/04/01/demiurge-3-types-of-javascript-inheritance-2/
相关文章:
- 在索引.html和应用.js [node.js] 之间共享变量
- Node.js上的WebSocket,并在所有连接的客户端之间共享消息
- 使用服务(AngularJS)在控制器之间共享数据
- AngularJS中的页面之间共享数据返回空
- 是否可以缓存可下载的文件,并在XHR和非XHR请求之间共享该缓存
- 在Knockoutjs中的ViewModels之间共享变量状态
- 通过共享服务在两个不同ng应用程序中的控制器之间共享数据
- Node.js服务器和浏览器之间共享二进制缓冲区
- 使用Angularjs在两个不同页面的控制器之间共享数据
- 在两个浏览器选项卡之间共享变量范围
- 不同进程之间共享Node.js环境
- 在Angular Bootstrap Modal和父控制器之间共享作用域
- 2ng控制器,并且需要在控制器之间共享数据
- Javascript创建函数,以便在其他函数之间共享变量
- 在控制器angular js之间共享数据
- 在javascript客户端和java服务器之间共享Google Analytics ClientID
- 如何将json文件中的数据提取到对象数组中,并在两个控制器之间共享
- Angular 2,在没有直接关系的两个组件之间共享一个对象
- 在angularJS中使用模态窗口时,在控制器之间共享对象数组
- 在角度上不同控制器之间共享状态