Javascript对象声明问题

时间:2012-10-03 01:01:12

标签: javascript oop

我第一次挖OOP但是我有一点问题:

var panel = {    
    img : imgs[24],
    prop : this.img.height / this.img.width,

    h : this.img.height - (scale),
    w : h/prop,

    x : center.x - (w / 2),
    y : center.y - (h / 2)    
}

panel.draw = function(){    
   g.ctx.drawImage(this.img,
      0, 0,
      this.img.width, this.img.height,
      this.x, this.y,
      this.w, this.h)
}

但似乎在this.img.height中声明typeError结果。有人可以解释原因吗?

另外,如何在对象声明中声明方法?没什么特别之处:我只是不希望我的代码看起来太乱。

5 个答案:

答案 0 :(得分:2)

您的对象始终是名称面板的静态对象吗?然后

var panel = {};
panel.img = imgs[24];
panel.prop = panel.img.height / panel.img.width;
...

它不是静态的,但你不想要它的实例?然后创建初始化函数以获得正确的this

var panel = {   // assuming "scale" and "center" in scope
        init : function(){
            this.img = imgs[24];
            this.prop = this.img.height / this.img.width;
            this.h = this.img.height - (scale);
            this.w = this.h / this.prop;
            this.x = center.x - (this.w / 2);
            this.y = center.y - (this.h / 2);
        }
};
panel.init();
...

您想拥有该对象的多个实例吗?然后创建一个构造函数

function Panel (img) { // assuming "scale" and "center" in scope
    this.img = img;
    this.prop = img.height / img.width;
    this.h = img.height - (scale);
    this.w = this.h / this.prop;
    this.x = center.x - (this.w / 2);
    this.y = center.y - (this.h / 2);
}
Panel..draw = function(){
...

并与var panel = new Panel( imgs[24] );

一起使用

答案 1 :(得分:1)

即使您认为自己没有这样做,也会引用不同的对象。因此,在您的示例中,第三行this是引用当前作用域而不是您正在创建的对象面板。 imgh

也是如此
var panel = {    
    img : imgs[24],
    prop : this.img.height / this.img.width, // this != panel here

    h : this.img.height - (scale), // this.img != panel.img
    w : h/prop, // h != panel.h

    x : center.x - (w / 2), // w != panel.w
    y : center.y - (h / 2)  // h != panel.h  
}

panel.draw = function(){    
   g.ctx.drawImage(this.img,
      0, 0,
      this.img.width, this.img.height,
      this.x, this.y,
      this.w, this.h)
}

应该像

var Panel = (function() {    
    function Panel(img, scale, center) {  
       this.img = img
       this.prop = img.height / img.width
       this.h = img.height - scale
       this.w = this.h/this.prop
       this.x = center.x - (this.w / 2),
       this.y = center.y - (this.h / 2)
    }
    Panel.prototype.draw = function(ctx) {
          ctx.drawImage(this.img, 0, 0,
          this.img.width, this.img.height,
          this.x, this.y,this.w, this.h)
    }          
})():

var panel = new Panel(imgs[24], scale, center);
panel.draw(g.ctx);

答案 2 :(得分:1)

这是因为this在使用 object literal 语法时永远不会是您正在创建的对象的引用。

它是对外部变量范围的引用。要使用文字语法,您需要创建不需要自引用的部分,然后在初始化后创建休息。

var panel = {    
    img : imgs[24],

    w : h/prop,

    x : center.x - (w / 2),
    y : center.y - (h / 2)    
};
panel.prop = panel.img.height / panel.img.width;
panel.h = panel.img.height - scale;

我不知道您的hprop变量应该引用什么。

如果您希望他们引用该对象的成员,那么您也需要将其删除。 center变量似乎突然出现了。

似乎你可能只是猜测JavaScript语法是如何工作的。如果是这样,这是一种难以学习的方法。在你继续之前我会推荐一个基础教程。

答案 3 :(得分:0)

Panel对象没有panel.img.height属性。

var panel = {    
    img :
        { height: // stuff here
        }
    prop : this.img.height / this.img.width,

    h : this.img.height - (scale),
    w : h/prop,

    x : center.x - (w / 2),
    y : center.y - (h / 2)    
}

答案 4 :(得分:0)

this指的是声明panel的上下文,而不是面板对象本身。一些解决方法:

缓存引用的对象:

var img = imgs[24];
var panel = {
    img: img
  , height: img.height - scale
  , //...

创建一个空白面板对象并逐个添加属性:

var panel = {};
panel.img = imgs[24]
panel.height = panel.img - scale;

方法可以像任何其他属性一样声明。

var panel = {
    img: imgs[24]
  , draw: function(){ g.ctx.drawImage(this.img, 0, 0) }
}