来自维基百科:
在面向对象的编程语言中,mixin 是一个类,它包含来自其他类的方法的组合。这种组合如何完成取决于语言,但不是通过继承。如果一个组合包含组合类的所有方法,则相当于多重继承。
在 Ember 中,对象的实例是create
使用不带参数的方法创建的,或者使用表示该类型属性的单个 hash(kvo),它们将被自动填充。例子:
var SomeClass = Ember.Object.extend({
name: '',
url: ''
});
// this instance will have a "name" and a "url" properties with blank values
var someInstance = SomeClass.create();
// this instance will have the same properties, but now
// their values will be populated
var anotherInstance = SomeClass.create({
name: 'Ember.js',
url: 'http://emberjs.com'
})
另一方面crateWithMixins
,允许您将另一个类定义混合到单个对象实例或另一个类中。因此,假设您与SomeClass
上述相同,但您不想通过子类化它extend
并创建另一种类型。在这种情况下,您可以使用 aMixin
来确保只有一个实例具有两个类的定义。例子:
var SomeClass = Ember.Object.extend({
name: '',
url: ''
});
// note that you don't extend a mixin, you only create
var SomeOtherClass = Ember.Mixin.create({
doSomething: function() {
console.log('doing my thing');
}
});
// This instance will have a method called "doSomething"
var x = SomeClass.createWithMixins(SomeOtherClass, {
name: 'Ember.js',
url: 'http://emberjs.com'
});
// this instance only has methods/properties defined in "SomeClass"
// therefore, no method called "doSomething"
var y = SomeClass.create({
name: 'Google',
url: 'http://google.ca'
});
但是,如果您想创建一个带有 a 的新类Mixin
,您可以extend
Em.Object
将Mixin
作为第一个参数传递,如下所示:
var AnotherClass = Ember.Object.extend(SomeOtherClass, {
firstName: '',
lastName: ''
});
var z = AnotherClass.create();
z.set('firstName', 'Hiro');
z.set('lastName', 'Nakamura');
z.doSomething();
查看API 文档以及此JSFiddle。
编辑:至于_super()
,您仅在创建新类时使用它(通过extend
)。当你create
现有类的实例时,你不应该调用_super()
.
另一件事。create
我看到你正在尝试View
直接。我相信,根据您的代码,您应该扩展Ember.View
并让框架在适当的时候为您创建实例。如果您手动创建,您将负责其工作流程的某些部分,例如将其附加到 DOM、将其删除等。也许我没有看到全貌,但仅基于此代码,我认为您不应该打电话给create
那里,然后打电话extend
,然后你就可以打电话了_super()