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(访问对象属性)

当你访问一个对象的属性时,使用getset访问器方法:

var person = Person.create();

var name = person.get('name');
person.set('name', "Tobias Funke");

请确保使用这些访问器方法,否则,计算属性不会重新计算,观察者不会触发,模板不会更新。

posted @ 2016-01-20 16:42  鱼不吐泡泡  阅读(400)  评论(0编辑  收藏  举报