• 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");

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

  • 相关阅读:
    Devexpress GridView 数据格式化显示
    贝叶斯算法
    贝叶斯算法
    科普 | 7 个步骤入门区块链
    科普 | 7 个步骤入门区块链
    漫画:Spring Boot、Java多线程、分布式、Java架构的高级架构师进阶之路
    漫画:Spring Boot、Java多线程、分布式、Java架构的高级架构师进阶之路
    ARP协议工作原理[同网段及跨网段]
    ARP协议工作原理[同网段及跨网段]
    过滤DataTable数据的Select()方法
  • 原文地址:https://www.cnblogs.com/sunshineground/p/5145730.html
Copyright © 2020-2023  润新知