[英]How to define objects with a function in javascript?
我想用三种略有不同的方式定义三个相同的对象。 唯一的不同是,我正在通过每个对象的源数据(通过括号表示法)访问不同的属性,如下所示
我正在使用的对象不是函数。 例如,Object1定义为
var Object1 = dc.lineChart("#chart-line-hitsperday");
var D = "Dimension1"
Object1
.width(200).height(200)
.dimension(SourceData.dimension(function (d) {return d[D];}))
.group(SourceData.dimension(function (d) {return d[D];}).group().reduceSum(function (d) {return d.Amount;}))
var D = "Dimension2"
Object2
.width(200).height(200)
.dimension(SourceData.dimension(function (d) {return d[D];}))
.group(SourceData.dimension(function (d) {return d[D];}).group().reduceSum(function (d) {return d.Amount;}))
var D = "Dimension3"
Object3
.width(200).height(200)
.dimension(SourceData.dimension(function (d) {return d[D];}))
.group(SourceData.dimension(function (d) {return d[D];}).group().reduceSum(function (d) {return d.Amount;}))
有没有一种方法可以定义每行1行代码,而不是三行代码。 换句话说,我想将以上转换为以下内容
Object1.definition("Dimension1")
Object2.definition("Dimension2")
Object3.definition("Dimension3")
通过将“定义”定义为:
definition(D) =
.width(200).height(200)
.dimension(SourceData.dimension(function (d) {return d[D];}))
.group(SourceData.dimension(function (d) {return d[D];}).group().reduceSum(function (d) {return d.Amount;}))
这可能吗?
在此处查看JSFiddle: http : //jsfiddle.net/chrisguzman/juhaoem2/
我已经尝试了以下方法,但是没有运气:
var definition = function(D){
this.width(200).height(200)
.dimension(SourceData.dimension(function (d) {return d[D];}))
.group(SourceData.dimension(function (d) {return d[D];}).group().reduceSum(function (d) {return d.Amount;}))
}
Object1.definition("Dimension1")
第二次尝试
Object1.prototype.definition = function(dim){
this.width(200).height(200)
.dimension(SourceData.dimension(function (d) {return d[dim];}))
.group(SourceData.dimension(function (d) {return d[dim];}).group().reduceSum(function (d) {return d.Amount;}))
};
尝试这个:
SuperObject.prototype.definition = function(dim){
this.width(200).height(200)
.dimension(SourceData.dimension(function (d) {return d[dim];}))
.group(SourceData.dimension(function (d) {return d[dim];}).group().reduceSum(function (d) {return d.Amount;}))
};
另外,您还应该定义以下功能:
SuperObject.prototype.width()
SuperObject.prototype.height()
SuperObject.prototype.dimenstion()
SuperObject.prototype.group()
或将它们放在SuperObject原型链中。
请注意, SuperObject
是Object1
, Object2
,...的构造函数。
更新#1
用法:
var obj = new SuperObject();
obj.definition("Dimension1");
使用this
?
definition = function(D){
this.width(200).height(200)
.dimension(SourceData.dimension(function (d) {return d[D];}))
.group(SourceData.dimension(function (d) {return d[D];}).group().reduceSum(function (d) {return d.Amount;}))
}
采用:
definition.call(Object1,"Dimension1");
您发布的代码非常不可读,因此我将尝试一个简单的示例:
var o1={},o2={},o3={}
,dimensions = ['Dimension1','Dimension2','Dimension3']
,objects=[o1,o2,o3]
,len=dimensions.length,i=-1;
while(++i<len){
//function returning function creating a closure
// in a while loop
objects[i].somefn=(function(d){
return function(){
console.log(d);
}
}(dimensions[i]));
objects[i].sameForAll='anything';
}
o1.somefn();
o2.somefn();
o3.somefn();
当变量名以大写字母开头时,通常意味着它是一个构造函数,因此,我建议不要使用大写字母,除非它们全部使用大写字母表示它们是常量。
[更新]
这是应用于您的代码的样子:
//wrap in IIFE
(function(dimensions,objects){
var i=-1,len=dimensions.length;
//for every object and dimension
while(++i<len){
//wrap in IIFE for closure
(function(object,D){//see later what object and D is
object
.width(200).height(200)
.dimension(
SourceData.dimension(
function (d) {
return d[D];
}
)
)
.group(
SourceData.dimension(
function (d) {
return d[D];
}
)
.group()
.reduceSum(
function (d) {
return d.Amount;
}
)
);
}(objects[i],dimensions[i]));//pass object and D
}
}(['Dimension1','Dimension2','Dimension3'],[Object1,Object2,Object3]))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.