我第一次挖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
结果。有人可以解释原因吗?
另外,如何在对象声明中声明方法?没什么特别之处:我只是不希望我的代码看起来太乱。
答案 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
是引用当前作用域而不是您正在创建的对象面板。 img
和h
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;
我不知道您的h
和prop
变量应该引用什么。
如果您希望他们引用该对象的成员,那么您也需要将其删除。 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) }
}