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

Javascript lang.mixin和declare.safeMixin之间的差异?Dojotoolkit,javascript,dojo,mixins,Javascript,Dojo,Mixins,我已经读过了,尽管作者提到了不同之处,但我还是不明白 我创建了两个小提琴,向您展示了declare.safeMixin和lang.mixin如何工作的不同情况 从Dojo代码中提取的关于declare.safeMixin的文档: 此函数用于像lang.mixin那样混合属性,但它跳过构造函数属性并像declare()那样装饰函数。 它用于declare生成的类和对象。 与dojo.safeMixin混合的函数可以像普通方法一样使用此.inherited() 此函数用于实现使用declare()生

我已经读过了,尽管作者提到了不同之处,但我还是不明白

我创建了两个小提琴,向您展示了
declare.safeMixin
lang.mixin
如何工作的不同情况

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

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

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

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

扩充使用
声明创建的dojo类:
可以找到工作示例。您需要打开控制台来查看日志

首先,我们声明一个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" });
如果我们调用speak方法,rob和peter将同时说
foo

  var object= {
    foo: "bar"
  };

  var anotherObject = {
    foo: "bar"
  };
现在我们用
declare.safeMixin
修改一个实例(
rob

  declare.safeMixin(rob, {
    secondMessage: "bar",
    speak: function() {
        this.inherited(arguments);
        console.log(`   ${this.name} says: '${this.secondMessage}'!`);
    }
  });
  declare.safeMixin(object, {
    baz: 123
  }, {
    baz: 1234
  });
。。。另一个(
peter
)带有
lang.mixin

  lang.mixin(peter, {
    secondMessage: "bar",
    speak: function() {
        // this.inherited(arguments); // would cause an error
        console.log(`   ${this.name} says: '${this.secondMessage}'!`);
    }
  });
  lang.mixin(anotherObject, {
    baz: 123
  }, {
    baz: 1234
  });
在那之后,Rob会说两个词,因为我们使用了
declare.safeMixin
,它说明我们可以在重写的
speak
方法中使用
this.inherited(arguments)

彼得只会说一个词,而不是罗布,因为我们使用了
lang.mixin
,它完全覆盖了我们早期的
speak
方法

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

有关工作示例,请参见

扩充简单java脚本对象: 可以找到工作示例。您需要打开控制台来查看日志

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

  var object= {
    foo: "bar"
  };

  var anotherObject = {
    foo: "bar"
  };
然后我们再次修改这两个。带有
declare.safeMixin
对象
实例

  declare.safeMixin(rob, {
    secondMessage: "bar",
    speak: function() {
        this.inherited(arguments);
        console.log(`   ${this.name} says: '${this.secondMessage}'!`);
    }
  });
  declare.safeMixin(object, {
    baz: 123
  }, {
    baz: 1234
  });
。。。以及另一个带有
lang.mixin
对象
实例

  lang.mixin(peter, {
    secondMessage: "bar",
    speak: function() {
        // this.inherited(arguments); // would cause an error
        console.log(`   ${this.name} says: '${this.secondMessage}'!`);
    }
  });
  lang.mixin(anotherObject, {
    baz: 123
  }, {
    baz: 1234
  });
请注意,我们在两个实例、两个对象上进行了混合!现在,如果我们尝试访问两个实例的
baz
属性,我们将得到不同的结果

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

anotherObject
实例
baz
属性将返回
1234
,因为
lang.mixin
支持每个方法调用混合多个java脚本对象。这里计算:最后一个赢了


希望这能让事情变得更清楚一点。

我创建了两个小提琴,向您展示了
如何声明。safeMixin
lang.mixin
工作的不同情况

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

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

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

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

扩充使用
声明创建的dojo类:
可以找到工作示例。您需要打开控制台来查看日志

首先,我们声明一个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" });
如果我们调用speak方法,rob和peter将同时说
foo

  var object= {
    foo: "bar"
  };

  var anotherObject = {
    foo: "bar"
  };
现在我们用
declare.safeMixin
修改一个实例(
rob

  declare.safeMixin(rob, {
    secondMessage: "bar",
    speak: function() {
        this.inherited(arguments);
        console.log(`   ${this.name} says: '${this.secondMessage}'!`);
    }
  });
  declare.safeMixin(object, {
    baz: 123
  }, {
    baz: 1234
  });
。。。另一个(
peter
)带有
lang.mixin

  lang.mixin(peter, {
    secondMessage: "bar",
    speak: function() {
        // this.inherited(arguments); // would cause an error
        console.log(`   ${this.name} says: '${this.secondMessage}'!`);
    }
  });
  lang.mixin(anotherObject, {
    baz: 123
  }, {
    baz: 1234
  });
在那之后,Rob会说两个词,因为我们使用了
declare.safeMixin
,它说明我们可以在重写的
speak
方法中使用
this.inherited(arguments)

彼得只会说一个词,而不是罗布,因为我们使用了
lang.mixin
,它完全覆盖了我们早期的
speak
方法

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

有关工作示例,请参见

扩充简单java脚本对象: 可以找到工作示例。您需要打开控制台来查看日志

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