Javascript对象文字:值初始化?

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

我正在使用object literal创建带有方法的对象。
这里有一个简单的例子

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:谢谢!看起来我粘贴后只编辑了一半。修复。