2.1 The Object Model -- Classes and Instances(类和实例)
一、Defining Classes(定义类)
1. 定义一个新的Ember类,调用Ember.Object上的extend()方法:
example:定义了一个含有say()方法的新的Person类。
Person = Ember.Object.extend({
say(thing) {
alert(thing);
}
});
2. 你也可以通过调用任何存在的class的extend()方法创建一个subclass。
example:你想创建一个Ember的内置Ember.Component类的子类
app/views/person.js
PersonView = Ember.Component.extend({ tagName: 'li', classNameBindings: ['isAdministrator'] });
3. 当你定义一个子类时,你可以重写父类的方法,但是你仍然可以通过调用_super()方法获取父类的实现。
Person = Ember.Object.extend({ say(thing) { var name = this.get('name'); alert(name + " says: " + thing); } }); Soldier = Person.extend({ say(thing) { this._super(thing + ", sir!"); } }); var yehuda = Soldier.create({ name: "Yehuada Katz" }); yehuda.say("Yes"); //alerts "Yehuada Katz says: Yes, sir!"
二、Creating Instances(创建实例)
1. 一旦你定义了一个类,你可以通过调用它的create()方法来创建新实例。对这个实例来说,任何你定义的在该类上的方法,属性和可计算的属性都是可用的。
var person = Person.create(); person.say("Hello");//alerts " says: Hello"
2. 当你创建一个实例,你可以通过给create()方法传递一个可选的hash初始化它的属性的值。
Person = Ember.Object.extend({ helloWorld() { alert("Hi, my name is " + this.get('name')); } }); var tom = Person.create({ name: "Tom Dale" }); tom.helloWorld();//alerts "Hi, my name is Tom Dale"
3. 处于性能原因,注意当调用create()时不能重新定义一个实例的计算属性和方法,或者定义一个新的。应该只设置简单属性时调用create()。如果你需要定义或者重定义方法或者计算属性,创建一个新的subclass并实现它。
4. 按照惯例,保存类的属性或者变量名是Pascal命名法,但是类的实例不是这样。例如,变量Person会指向一个类,然而person会指向一个实例(通常是Person类)。在你的Ember应用程序中,你应该坚持这些命名规则。
三、Initializing Instances(初始化实例)
1. 当一个新的实例被创建,它的init方法被自动调用。这是理想的地方来设置所需的新实例:
Person = Ember.Object.extend({ init() { var name = this.get('name'); alert(name + ", reporting for duty!"); } }); Person.create({ name: "Stefan Penner" }); //alerts "Stefan Penner, reporting for duty!"
2. 如果你是子类化一个框架内部的类,例如Ember.Component,你重写init方法,确保你调用this._super()!如果你没有这样做,系统可能没有机会去做重要的设置工作,在你的应用程序中你将会看到奇怪的行为。
四、Accessing Object Properties(访问对象属性)
当你访问一个对象的属性时,使用get和set访问器方法:
var person = Person.create(); var name = person.get('name'); person.set('name', "Tobias Funke");
请确保使用这些访问器方法,否则,计算属性不会重新计算,观察者不会触发,模板不会更新。