javascript - 从异步调用访问另一个对象原型(prototype)上的对象

标签 javascript oop prototype

我有一个异步调用,当它完成时,我想在父级上设置一个属性。

参加以下类(class),猫:

var cat = function(){
   this.isLoaded = false;
   this.image = new Image();
   this.image.onload = function(){
     //how can I set the isLoaded variable above from here??
   }
   this.image.src = "...";
}

我希望能够做到:

var myCat = new cat();
if(myCat.isLoaded)
....

我似乎无法弄清楚如何从 onload 中设置上面的 isLoaded 属性。我可以通过执行“isLoaded”来访问它,但我认为我是按值访问它,而不是引用,因此无法更改它。

这似乎是一个简单的解决方案,我想我缺乏更深入的理解。

谢谢!

最佳答案

onload回调中,isLoadedundefined,如果你设置它,它会是window.isLoaded(本质上是全局的)。

回调的 this 也指向一个 img 元素,而不是它的父函数。我制作了一个指向外部函数的 thisthat 变量。函数中的函数可以访问其外部函数在 JavaScript 中的作用域。

var Cat = function(){
   this.isLoaded = false;
   this.image = new Image();
   var that = this;
   this.image.onload = function(){
     that.isLoaded = true;
   }
   this.image.src = "http://www.gravatar.com/avatar/5e28492984e3056904e295c43337655f?s=32&d=identicon&r=PG";
}

var c = new Cat();

console.log(c.isLoaded); // false

setTimeout(function() { console.log(c.isLoaded) }, 1500); // true

jsFiddle .

当然,setTimeout() 仅用于此示例。如果您正在加载图像,则应依赖回调,因为确定图像是否已加载的唯一其他方法是轮询 - 这不是一个很好的接口(interface)。

你应该提供一个地方来传递回调,这样你就可以...

var c = new Cat(function() {
   // Image loaded, proceed.
});

关于javascript - 从异步调用访问另一个对象原型(prototype)上的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5322152/

相关文章:

javascript - 字符串插值,如 scala.js 的 java.text.MessageFormat

javascript - blockUI 与 IE11 的兼容性问题?

javascript - 在 v5 中扩展 d3.selection——这是正确的做法吗?

php - PDO 自定义类和安全性

c++ - 使用 ImageList 进行图像的面向对象设计

javascript - _.extend(Something.prototype, someObj) 和 Something.prototype.someFunc = someFunc 有什么区别?

javascript - 循环链表和更改原型(prototype)中对象属性的错误

javascript - 如何在alexa sdk V2技能中获取亚马逊电子邮件

javascript - 使用新计算器克隆 div 以获得新 div

java - 构造函数定义中的 NullPointerException