lang.mixin和declare.safeMixin之间的差异? Dojotoolkit

时间:2016-07-26 13:52:24

标签: javascript dojo mixins

我已经阅读了documentation,即使作者提到了差异,我仍然没有得到它。

1 个答案:

答案 0 :(得分:3)

我创建了两个小提琴,向您展示declare.safeMixinlang.mixin工作方式的不同情况。

从Dojo代码中提取的有关declare.safeMixin的文档:

  

此函数用于混合lang.mixin这样的属性,但它会跳过构造函数属性并装饰像declare()那样的函数。
  它适用于使用声明生成的类和对象   与dojo.safeMixin混合使用的函数可以像普通方法一样使用this.inherited()   此函数用于实现使用declare()生成的构造函数的extend()方法。

从Dojo代码中提取的有关lang.mixin的文档:

  

所有属性,包括函数(有时称为"方法"),不包括Object.prototype中的任何非标准扩展,都会从源复制/添加到dest。来源从左到右处理   Javascript赋值运算符用于复制/添加每个属性;因此,默认情况下,mixin执行所谓的"浅拷贝"和聚合类型通过引用复制/添加。

扩充使用declare

创建的dojo类
  

可以找到工作示例here。您需要打开控制台才能查看日志。

首先我们声明一个dojo类Person,然后创建这个类的两个实例:

var Person = declare(null, {
  name: null,
  message: "foo",
  constructor: function(args) {
    this.name = args.name;
  },
  speak: function() {
    console.log(`   ${this.name} says: '${this.message}'!`);
  }
});


var rob = new Person({ name: "Rob" });
var peter = new Person({ name: "Peter" });

如果我们拨打发言方法,rob和彼得会同时说foo

现在我们使用rob ...

修改一个实例(declare.safeMixin
  declare.safeMixin(rob, {
    secondMessage: "bar",
    speak: function() {
        this.inherited(arguments);
        console.log(`   ${this.name} says: '${this.secondMessage}'!`);
    }
  });

...另一个(peter)与lang.mixin

  lang.mixin(peter, {
    secondMessage: "bar",
    speak: function() {
        // this.inherited(arguments); // would cause an error
        console.log(`   ${this.name} says: '${this.secondMessage}'!`);
    }
  });

之后,Rob会说两个字,因为我们使用declare.safeMixin,注释我们可以在覆盖 this.inherited(arguments)方法中使用speak。< / p>

彼得只会说一个字,而不是Rob,因为我们使用lang.mixin,完全覆盖我们的earliere speak方法。

注意:您可以使lang.mixin允许使用inherited的方式编写代码(您需要明确命名要调用的方法) this.inherited):

lang.mixin(peter, {
  secondMessage: "bar",
  speak: function() {
      this.inherited('speak', arguments);
      console.log(`   ${this.name} says: '${this.secondMessage}'!`);
  }
});
  

有关工作示例,请参阅here

扩充一个简单的java脚本对象:

  

可以找到工作示例here。您需要打开控制台才能查看日志。

首先我们声明两个具有相同属性foo的对象。

  var object= {
    foo: "bar"
  };

  var anotherObject = {
    foo: "bar"
  };

然后我们再修改两者。 object实例declare.safeMixin ...

  declare.safeMixin(object, {
    baz: 123
  }, {
    baz: 1234
  });

...以及anotherObject lang.mixin实例。

  lang.mixin(anotherObject, {
    baz: 123
  }, {
    baz: 1234
  });

注意,我们在两个实例上混合,两个对象!现在,如果我们尝试访问两个实例的baz属性,我们将得到不同的结果。

object实例baz属性将返回123,因为declare.safeMixin每个方法调用仅支持mixin一个java脚本对象。

anotherObject实例baz属性将返回1234,因为lang.mixin支持每个方法调用混合多个java脚本对象。重要的是:最后一个获胜。

希望这会让事情变得有点清楚。