Ember.js 入门指南——类的定义、初始化、继承

本系列文章全部从(http://ibeginner.sinaapp.com/)迁移过来,欢迎访问原网站。

Ember JS的类也具有高级语言的许多特性,其实现方式也与高级语言(如Java)非常类似。Ember类继承使用extend()方法,可以在方法传入参数,但是参数要以hash列表方式传入。关于类的命名规则在此不做介绍,自己网上找一份Java的命名规则的教材看看即可。

开始之前先做好准备工作,首先创建一个HTML文件,并引入Ember JS所必须的文件。由于博客不支持HTML标签输入,详细代码请到github下载;

1,类定义

下面定义一个Person类,定义方式如下:

    Person = Ember.Object.extend({
  say(thing) {
    alert(name);
  }
});

上面代码定义了一个Person类,并且在类里面还定义了一个方法say,方法传入一个参数thing。方法体仅仅是打印了传入的参数。

2,类继承

在子类重写父类的方法,再方法里调用_super()方法来调用父类的方法。

 Person = Ember.Object.extend({
    
  say(thing) {
    var name = this.get(‘name‘);
    alert(name + " says: " + thing);
  }
});

Soldier = Person.extend({
    
  say(thing) {
    // this will call the method in the parent class (Person#say), appending
    // the string ", sir!" to the variable `thing` passed in
    this._super(thing + ", sir!");
  }
});

var yehuda = Soldier.create({
  name: "Yehuda Katz"
});

yehuda.say("Yes"); // alerts "Yehuda Katz says: Yes, sir!"

运行代码,刷新浏览器,可以看到如下结果

结果正确了,但是我们还不知道类是怎么初始化的,它初始化的次序又是怎么样的呢?其实每个类都有一个默认的初始化方法,555……别急,我们后面会介绍的。

3,类实例化

要获取一个类的实例只需要调用类的create()方法即可。

Person = Ember.Object.extend({
    show() {
        console.log("My name is " + this.get(‘name‘));
    }
});
var person = Person.create({
    name: ‘ubuntuvim‘
});
person.show();  // My name is ubuntuvim
   
var person2 = Person.create({
    pwd: ‘ubuntuvim‘
});
person2.show();  // My name is undefined

你可以在调用create()方法的时候传入参数,但是要注意传入的参数名要跟来成员属性名一致,否则无法获取属性值。Ember出于性能考虑不允许在调用create()方法的时候重新定义新的属性名,所以第二个show()方法输出是undefined。

4,类初始化

前面提过,我们在类继承的时候到底类是怎么初始化,这节就介绍类的初始化,Ember定义了一个init()方法,此方法在类被实例化的时候自动调用。

Parent = Ember.Object.extend({
    init() {
        console.log("parent init...");
    },
    show() {
        console.log("My name is " + this.get(‘name‘));
    },
    others() {
        console.log("the method in parent class..");
    }
});
//parent = Parent.create({
//    name: ‘parent‘
//}); 
   
Child = Parent.extend({
    init() {
        console.log("child init...");
    },
    show() {
        this._super();
    }
});
 
child = Child.create({
    name: ‘child‘
});   
child.show();
child.others();

注意:init()方法只有在类的create()方法被调用的时候才会被自动调用,上面的例子中,如果只是child.others()这个方法父类并不会调用init()方法,只有执行Parent.create()这个调用的时候才会执行init()方法。

上面代码如果把“Parent.create()”这几句代码注释掉得到的结果如下

可见父类的init()方法没有被调用,然后修改代码,注释掉“child.others()”这句,再把“Parent.create()”这几句的注释去掉。得到如下结果

可以看到父类的init()方法被调用了!由此可见init()方法是在调用create()方法的时候才调用的。

在项目中有可能你需要继承Ember提供的组件,比如继承Ember.Component类,此时你就要注意了,在你继承Ember的组件的时候你必须显式的调用父类方法“this._super()”否则你继承得到的类无法获取Component提供的行为或者你回得到无法预知的结果。

5,类属性的访问

Ember建议访问类的属性使用get、set方法。如果你直接使用“obj.prop”这种方式访问也是可以得到类的属性值,但是如果你不是使用访问器操作的就会导致很多问题:计算属性不能被重新计算、无法察觉对象属性的变化、模板也不能自动更新。这些内容会在后面介绍。

Person = Ember.Object.extend({
    name: ‘ubuntuvim‘
});
// Ember 推荐的访问方式
var person = Person.create();
console.log("My name is " + person.get(‘name‘));
person.set(‘name‘, "Tobias Funke");
console.log("My name is " + person.get(‘name‘));  
 
console.log("---------------------------");
//  不推荐的方式
var person2 = Person.create();   
console.log("My name is " + person2.name);
person2.name = "Tobias Funke";
console.log("My name is " + person2.name);

Ember为我们封装了get、set实现细节,开发者直接使用即可。后面的文章我会为大家讲讲Ember是去封装的,现在暂时不讲。

时间: 2024-08-08 20:26:51

Ember.js 入门指南——类的定义、初始化、继承的相关文章

Ember.js 入门指南——总目录

Ember.js 是什么?我想对于想学习它的人应该知道它是个什么东西,如果你想了解那就赶紧去 Google 或者百度,本系列教程是通过学习官网教程然后摘抄个人觉得比较重要的部分,加上学习实例整合而成,如有疏漏欢迎提出修改意见,一起成长! Ember官网:http://emberjs.com/ 教程官网:http://guides.emberjs.com/v2.0.0/ 在此简单介绍下 Ember: Ember是一个雄心勃勃的Web应用程序,消除了样板,并提供了一个标准的应用程序架构的JavaSc

Ember.js 入门指南--目录

本系列文章全部从(http://ibeginner.sinaapp.com/)迁移过来,欢迎访问原网站. Ember.js 是什么?我想对于想学习它的人应该知道它是个什么东西,如果你想了解那就赶紧去 Google 或者百度,本系列教程是通过学习官网教程然后摘抄个人觉得比较重要的部分,加上学习实例整合而成,如有疏漏欢迎提出修改意见,一起成长! Ember官网:http://emberjs.com/ 教程官网:http://guides.emberjs.com/v2.0.0/ 在此简单介绍下 Emb

Ember.js 入门指南——路由定义

当你的应用启动的时候,路由器就会匹配当前的URL到你定义的路由上.然后按照定义的路由层次逐个加载数据.设置应用程序状态.渲染路由对应的模板. 1,基本路由 在app/router.js的map方法里定义的路由会映射到当前的URL.当map方法被调用的时候方法体内的route方法就会创建路由. 下面使用Ember CLI命令创建两个路由: ember generate route about ember generate route favorites 命令执行完之后你可在你的项目目录app/ro

Ember.js 入门指南——控制器(controller)

ember new chapter5_controllers cd chapter5_controllers ember server 从本篇开始进入第五章控制器,controller在Ember2.0开始越来越精简了,职责也更加单一--处理逻辑. 下面是准备工作. 从新创建一个Ember项目,仍旧使用的是Ember CLI命令创建. 在浏览器执行项目,看到如下信息说明项目搭建成功. Welcome to Ember 1,控制器简介 控制器与组件非常相似,由此,在未来的新版本中很有可能组件将会完

Ember.js 入门指南——model简介2

本文接上一篇<Ember.js 入门指南--model简介1>. 2,核心概念 声明:下面简介内摘抄至http://www.emberjs.cn/guides/models/#toc_. 1,store store是应用存放记录的中心仓库.你可以认为store是应用的所有数据的缓存.应用的控制器和路由都可以访问这个共享的store:当它们需要显示或者修改一个记录时,首先就需要访问store. DS.Store的实例会被自动创建,并且该实例被应用中所有的对象所共享. store可以看做是一个缓存

Ember.js 入门指南——属性传递

1,传递参数到组件上 每个组件都是相对独立的,因此任何组件所需的数据都需要通过组件的属性把数据传递到组件中. 比如上篇<Ember.js 入门指南--组件定义>的第三点"{{component item.pn post=item}}"就是通过属性post把数据传递到组件foo-component或者bar-component上.如果在index.hbs中是如下方式调用组件那么渲染之后的页面是空的. {{component item.pn}} 请读者自己修改index.hbs

Ember.js 入门指南——包裹内容

准备工作: ember g route wrapping-content-in-component-route        ember g component wrapping-content-in-component 有些情况下,你需要定义一个包裹其他模板提供的数据的组件.比如下面的例子: <!--  app/templates/components/wrapping-content-in-component.hbs  -->   <h1>{{title}}</h1>

Ember.js 入门指南——路由简介

从本文开始,将为大家介绍路由(route),如果你看过前面的<Ember.js 入门指南--{{link-to}} 助手>这篇文章应该初步了解了route.不过在这篇文章中只是简单介绍了路由是定义.路由层次,更深入的route将从本文开始逐一介绍. 当用户使用你的应用时,应用要在不同的状态之间切换.Ember提供了很多工具用于管理那些因应用规模改变而改变的状态. 讲route前先了解URL,在应用中大概会会有如下方式设置URL: 用户第一次加载应用的时: 用户手动改变URL,比如点击按钮之后跳

Ember.js 入门指南——异步路由

本文将为你介绍路由的高级特性,这些高级特性可以用于处理项目复杂的异步逻辑. 关于单词promises,直译是承诺,但是个人觉得还是使用原文吧.读起来顺畅点. 1,promises(承诺) Ember的路由处理异步逻辑的方式是使用promises.简而言之,promises就是一个表示最终结果的对象.这个对象可能是fulfill(成功获取最终结果)也可能是reject(获取结果失败).为了获取这个最终值,或者是处理promises失败的情况都可以使用then方法,这个方法接受两个可选的回调方法,一