【问题标题】:Relation between an Object life cycle and method calls from a webpage对象生命周期与网页方法调用之间的关系
【发布时间】: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


【解决方案1】:

move 方法是更新Elmxy 属性。但是他们并没有更新 img 的样式。

试试类似的东西

var Elm = function (x, y) {
  this.x = x;
  this.y = y;
};

Elm.prototype.insert = function () {
  this.img = document.createElement("img");
  this.img.id = "pic1";
  this.img.src = "http://someurl.com/images/pic.png";
  this.img.style.position = 'absolute';
  this.img.style.left = this.x + "px";
  this.img.style.top = this.y + "px";
  document.body.appendChild(this.img);
};

Elm.prototype.move = function (x,y) {
  this.x += x;
  this.img.style.left = this.x + "px";
  this.y += y;
  this.img.style.top = this.y + "px";
};

var pic;

function img_insert(x,y) {
  pic = new Elm(x, y);
  pic.insert();
}

function img_move(x,y) {
  pic.move(x,y);
}

【讨论】:

  • 代码中断:function img_move(x,y) { img.move(x,y); // 这里 } img 没有定义,如果我再次实例化 img 我将不得不删除插入的 img 并附加新的 x,y,对吧?
  • 您的代码中的img 是什么?它没有在您的示例中定义,所以我假设它是之前定义的 Elm 实例。
  • 我根据整个示例进行了更新,应该使其完全正常运行
  • 是的。 let img = document.createElement("img");
  • 一个img 元素没有move 方法。您试图从错误对象上的Elm 原型调用move 方法。请检查更新的答案。
猜你喜欢
  • 1970-01-01
  • 2020-12-25
  • 1970-01-01
  • 2011-12-01
  • 2011-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多