Javascript对象文字:值初始化?
我正在使用object literal创建带有方法的对象。Javascript对象文字:值初始化?,javascript,constructor,object-literal,Javascript,Constructor,Object Literal,我正在使用object literal创建带有方法的对象。 这里有一个简单的例子 var SizeManager = { width : 800, height : 600, ratio : this.width / this.height, resize : function (newWidth) { width = newWidth; height = newWidth / ratio; } } 我的问题是SizeMa
这里有一个简单的例子
var SizeManager = {
width : 800,
height : 600,
ratio : this.width / this.height,
resize : function (newWidth) {
width = newWidth;
height = newWidth / ratio;
}
}
我的问题是SizeManager.ratio返回“NaN”。我很确定这是一个初始化问题。有没有办法获得正确的比率值?
有没有办法将构造函数或初始值设定项分配给对象文字?
定义构造函数对象集是唯一的方法吗
编辑:off-course SizeManager在理想情况下是一个单一对象(只有一个对象),这是我使用object literal的方式。如果您希望它根据对
宽度和高度的更改而更改,则比率实际上应该是一个方法:
var SizeManager = {
width : 800,
height : 600,
ratio : function() {
return this.width / this.height;
},
resize : function (newWidth) {
width = newWidth;
height = newWidth / ratio;
}
}
另外,您可能希望在resize
方法中引用this.width
和this.height
而不是width
和height
。是的,这是一个初始化问题此
不引用您使用时的SizeManager
对象。(对象初始值设定项不会更改此
的值)此
由调用函数的方式设置,并且在整个函数调用过程中具有相同的值。您没有在那里调用任何函数,因此这个
具有在该代码开始之前的任何值
(在本文的最后,我已经从您的具体示例中指出了一些关于比率的内容,但首先让我们为您提出的一般情况浏览一些选项。)
将比率
作为一个函数是一个很好的方向,除非他似乎没有意识到你想要改变宽度。或者,如果width
和height
不会改变,只需在以后计算:
var SizeManager = {
width : 800,
height : 600,
resize : function (newWidth) {
this.width = newWidth;
this.height = newWidth / this.ratio;
}
};
SizeManager.ratio = SizeManager.width / SizeManager.height;
(旁注:我已将添加到此。
添加到您在resize
中引用的属性中。原始属性中缺少这些属性,但它们是必需的。没有它们,您将处理,这是一件坏事(tm)。)
当然,您可以将所有这些封装到工厂中:
function makeSizeManager(width, height) {
return {
width : width,
height : height,
ratio : width / height,
resize : function (newWidth) {
this.width = newWidth;
this.height = newWidth / this.ratio;
}
};
}
var SizeManager = makeSizeManager(800, 600);
…但您也可以将其作为实际的构造函数,这样就不会创建大量重复(但相同)的resize
函数:
function SizeManager(width, height) {
this.width = width;
this.height = height;
this.ratio = width / height;
}
SizeManager.prototype.resize = function (newWidth) {
this.width = newWidth;
this.height = newWidth / this.ratio;
};
var aSizeManagerInstance = new SizeManager(800, 600);
(注意,我在最后一张上稍微更改了名称。)
最后一点注意:在您的特定示例中,实际上根本不需要存储比率,您可以这样做:
var SizeManager = {
width : 800,
height : 600,
resize : function (newWidth) {
var ratio = this.width / this.height;
this.width = newWidth;
this.height = newWidth / ratio;
}
};
但这只是针对那个特定的例子,因此上面的讨论是关于一般情况的。在对象文本中,这个
仅指对象文本本身,当它位于函数中时。您可以尝试这样的方法,而不是使用对象文字<代码>此
将引用在函数内部和外部创建的对象
var SizeManager = new function(){
this.width = 800;
this.height = 600;
this.ratio = this.width / this.height;
this.resize = function (newWidth) {
this.width = newWidth;
this.height = newWidth / this.ratio;
}
}
这将适用于单例模式。如果需要多个SizeManager,请将其设置为构造函数而不是对象
function SizeManager (w, h){
w && (this.width=w);
h && (this.height=h);
this.ratio = this.width / this.height;
}
SizeManager.prototype={
width: 800,
height: 600,
resize: function (newWidth) {
this.width = newWidth;
this.height = newWidth / this.ratio;
}
}
在resize函数中,ratio
需要更改为this.ratio()
,因此ratio必须更改为一种方法,不能作为属性。对吗?@Josh我没有更改调整大小的方法,我将把它留给OP。不过,最好在更改宽度之前先缓存旧的比率,因为ratio
是一个函数,值在之后会更改。宽度更改。@bonfo如果ratio
不是一个方法,值将永远不会更改(除非您显式重置SizeManager.ratio=…
),因此,除非您希望将比率固定为800/600,否则它应该是一个方法。“在对象文本中,此
仅在对象文本位于函数内时才引用对象文本本身。”您的代码段中根本没有对象文字。有一个构造函数,您可以通过new
立即调用它,但没有对象文字。在构造函数中,this
指由new
创建的新对象,作为调用函数的一部分。调用resize
后比率将为inaccurate@T.J.克劳德:我是说他的代码中的对象文字,而不是我的,很明显,正如你所指出的,我的代码中没有对象文字。上下文,伙计。@不:我想我明白你的意思,但坦率地说,我已经改写了它。我很了解这些东西,但仍然认为你是在说你的代码,而不是他的.JS标准我的公司禁止使用“w&&this.width=5”,这不太容易理解。如果要将其从对象文字更改为函数,则需要更改指定属性的方式(在第三段代码中).ie.this.width=width
而不是this.width:width
@Daniel:谢谢!看起来我粘贴后只编辑了一半。修复。