【发布时间】:2019-08-04 11:08:10
【问题描述】:
我是 OOP 的新手,我对实例化对象和通过网页调用的方法之间的关系有一些疑问。
例如。我有一个对象,其方法将元素附加到网页中,如下所示:
var Elm = function (x, y) {
this.x = x;
this.y = y;
};
Elm.prototype.insert = function () {
let img = document.createElement("img");
img.id = "pic1";
img.src = "http://someurl.com/images/pic.png";
img.style.position = 'absolute';
img.style.left = this.x + "px";
img.style.top = this.y + "px";
document.body.appendChild(img);
};
Elm.prototype.move = function (x,y) {
this.x += x;
this.y += y;
};
function img_insert(x,y) {
var pic = new Elm(x, y);
pic.insert();
}
function img_move(x,y) {
img.move(x,y);
}
然后在 html 中我有 2 个按钮,一个调用 img_insert,第二个调用 img_move。即使我按照顺序先调用 img_insert 然后调用 img_move。第二个不行。
调用第一个函数 img_insert 后,最终结果将是网页上的“物理”榆树,而在代码离开函数后,我理解对象的方式就消失了。问题在于第二个函数:img_move 并不是真正关于操纵已经死去的对象,而是实际上关于通过 id 获取 img 并更改 x 和 y 样式属性来操纵 DOM,对吧?
我知道如何进行 DOM 操作,我的疑问实际上是关于代码设计及其与网页的关系。提前感谢您的意见。
【问题讨论】:
-
如果你想保留对象,你必须存储在一些(全局)变量或数据结构中,
img_move可以访问它。此外,您还需要从Elm实例到 DOM 元素的引用,以便move方法可以更新它。 -
嗯,但再次拥有全局变量,可能不是一个好的设计。我相信,考虑到它是与网页交互的代码。第一步是 OOP,第二步是纯 DOM 操作。???还考虑到在第一个按钮单击后,img 无论如何都已经在网页上。对于第一个按钮,只需获取 html elm 并更改其样式属性。而不是回到类/对象模型中的代码???
-
但这就是当您从全局按钮的全局事件处理程序中调用两个全局函数时将得到的结果……当然,您可以封装所有这些,使其不再是全局的。跨度>
-
不确定您对“OOP”和“纯 DOM 操作”有何区别?它们可能是一个并且是相同的。是的,您可以考虑只获取 html 元素并更改其样式属性,但是您将不再需要您的
Elm实例。 -
我以为在第一次 btn 点击后,Elm 实例就会消失。实际上,这是我的主要疑问,据我了解,浏览器会一直保持活动状态,直到我关闭页面?
标签: javascript html oop