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
instancesbaz
属性将返回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脚本对象:
可以找到工作示例。您需要打开控制台来查看日志
首先,我们声明两个具有相同属性的对象