【问题标题】:How to copy objects inside constructor in javascript如何在javascript中复制构造函数中的对象
【发布时间】:2015-07-11 07:11:04
【问题描述】:

我要创建自定义图像构造函数:

var image1 = new imgConstructor("picture.png", 100, 50);

我试过了:

var imgConstructor = function(src, width, height) {
    this = new Image(width, height);
    this.src = src;
}

但是this = new Image()无效。

我知道我可以使用工厂函数来做到这一点:

var imgConstructor = function(src, width, height) {
    var img = new Image(width, height);
    img.src = src;
    return img;
}
var image1 = imgConstructor("picture.png", 100, 50);

但我想使用构造函数,使用 "new"。有什么想法吗?

【问题讨论】:

    标签: javascript image object constructor src


    【解决方案1】:

    但我想使用new 来处理构造函数。有什么想法吗?

    不,这是不可能的。毕竟你不能继承Image。如果您需要使用自己的方法的“实例”,最好创建一个包装器对象(例如在构造函数中执行 this.img = new Image(…))。

    使用工厂函数完全没问题,在这里似乎很合适。如果你出于某种原因想使用new,你可以在你的工厂函数上使用new,它仍然可以工作(尽管产生Image,而不是imgConstructor的实例)。

    【讨论】:

    • 谢谢,你能解释一下“产生图像,而不是 imgConstructor 的实例”的缺点吗?
    • 当有人调用new imgConstructor 时,通常会期望结果是imgConstructor 的一个实例。并非总是如此,因为构造函数 returns 明确表示的对象可能有所不同。
    【解决方案2】:

    继承在这里帮不了你。因为Image 不能被继承。 See why here

    基本解释:

    var a = new Image();
    console.log(a.constructor); // Should be function Image() { [native code] }
    // OUTPUT: function HTMLImageElement() { [native code] }
    
    var b = new HTMLImageElement();
    // Uncaught TypeError: Illegal constructor
    

    所以,你的解决方案是正确的。

    编辑: @user86745458 的解决方案有效,但正如 @Bergi 所说:

    当有人调用 new imgConstructor 时,通常会期望 结果是 imgConstructor 的一个实例。并非总是如此 构造函数显式返回一个可能是某物的对象 不同。

    尝试应用旧的解决方案(来自@user86745458)并检查:

    new imgConstructor() instanceof imgConstructor
    // OUTPUT: false 
    imgConstructor() instanceof imgConstructor
    // OUTPUT: false
    imgConstructor() instanceof Image
    // OUTPUT: true
    

    【讨论】:

      【解决方案3】:

      尝试添加类似这样的内容

      var imgConstructor = function(src, width, height) {
          var img = this;
          img = new Image(width, height);
          img.onload = function(){
            // image  has been loaded
          };
          img.src = src;
          return img;
      }
      

      【讨论】:

      • 很好,但它不会返回我认为的图像。我想返回图像对象并在之后加载它
      • 为什么它不起作用:var img = this; 好的,存储对this 对象的引用。 img = new Image(width, height); 丢弃最后一个引用并存储一个新引用。
      • 您添加了“return img;”线?现在它就像一个魅力。我用 image1 = new imgConstructor 调用它,它工作正常。但是不需要“var img = this”这一行?我删除了它,该功能仍然有效
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-09
      相关资源
      最近更新 更多