我已经阅读了documentation,即使作者提到了差异,我仍然没有得到它。
答案 0 :(得分:3)
我创建了两个小提琴,向您展示declare.safeMixin
和lang.mixin
工作方式的不同情况。
从Dojo代码中提取的有关declare.safeMixin
的文档:
此函数用于混合lang.mixin这样的属性,但它会跳过构造函数属性并装饰像declare()那样的函数。
它适用于使用声明生成的类和对象 与dojo.safeMixin混合使用的函数可以像普通方法一样使用this.inherited() 此函数用于实现使用declare()生成的构造函数的extend()方法。
从Dojo代码中提取的有关lang.mixin
的文档:
所有属性,包括函数(有时称为"方法"),不包括Object.prototype中的任何非标准扩展,都会从源复制/添加到dest。来源从左到右处理 Javascript赋值运算符用于复制/添加每个属性;因此,默认情况下,mixin执行所谓的"浅拷贝"和聚合类型通过引用复制/添加。
declare
:可以找到工作示例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。
可以找到工作示例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脚本对象。重要的是:最后一个获胜。
希望这会让事情变得有点清楚。