SmartJS2.0加入OOP的功能。OOP包括klass与factory两个对象。

Klass 类继承

与其他的类继承相比,smartjs使用了执行指针的概念(后面例子中会介绍),另外提供base基类和初始化控制的扩展功能。

首先来看看接口:

  var _klass = st.klass(name, prop, parent, config);
//new _klass() 与 _klass()效果相同,实现了自初始化功能更
var obj = new _klass();

name : 类名

prop : 类属性&方法

parent :[可选],父类对象

config :[可选],类配置参数,做动态扩展使用;后续版本会加入内容;

注意自初始化方法为:klassInit,在实例化时执行

实例化类后,对象会具有以下方法和属性:

//获取基类对象
obj.getBase(baseName);


//执行基类对象
obj.callBase(fnName, baseName, args);


//对象扩展方法
obj.extend(prop);


//父类对象
obj._$super


//类标示
obj._$klass : bool


//类名
obj._$kName : string


//继承链
obj._$inheirts : array

此外两种全局扩展方式:

1. 基于原形链的基类扩展,使用st.conf('oop-KlassBase'),可以取到基类对象进行扩展

2. 在类初始化时,对实例化的对象进行扩展,可以使用st.onKlassInit对象进行添加扩展方法。

st.onKlassInit 是promiseEvent对象,参数为:obj,conf

  obj:类对象

  conf:即klass定义的时候的conf

代码示例

基础

 var user = st.klass("user", {
klassInit: function(name) {
this.name = name;
},
say: function(text) {
return this.name + ',' + text;
}
}); var user1 = new user('roy'),
//执行方法与实例化等效
user2 = user('tracy'); expect(user1.name).toBe('roy');
expect(user1.say('hello')).toBe('roy,hello');
expect(user2.name).toBe('tracy');
expect(user2.say('hello')).toBe('tracy,hello');

综合例子

var user1 = st.klass("user1", {
name: 'user1',
//自初始化方法为:klassInit,在实例化时执行
klassInit: function() {}
}, user); //继承测试
it("inheirt", function() { var roy = user1('roy'); expect(roy.name).toBe('user1');
expect(roy.say('hello')).toBe('user1,hello');
}) //调用父类测试
it("klassBase - callBase", function() {
var roy = user1();
roy.callBase('klassInit', ['roy']);
expect(roy.name).toBe('roy');
}) //扩展例子
it("klassBase - extend", function() {
var roy = user1();
roy.extend({
say: function() {
return "extend";
}
}); expect(roy.say()).toBe('extend');
expect(roy.callBase('say', ['extend'])).toBe("user1,extend");
})

多级继承例子。在多级继承中有一种场景每个子类方法都会调用父类的方法,而方法中又会使用到当前对象的属性,则问题就来了;

如果是采用的parent.xxx然后传递this下的属性值过去,则没太大的问题。backbone就采用的这种。

另外像base.js直接改写原始方法,将父对象封入闭包中,也无问题。只是这种限制比较大,只能调用父类的同名方法。

而dojo采用的是this.parent.xxx.call(this)的方式,则就会悲剧了,死循环就来了。

导致这样的原因就是将this带入parent方法后,父类又执行this.parent。而这是this则是子类的对象,那么方法就只会不停的调用parent的方法。

有兴趣的朋友可以下去看下,项目上面使用的继承会出现此问题。如果有更好的方案,希望能分享。

smart采用类继承的方式与dojo比较类似,但是调用父类方法由callBae这个方法来代理,同时使用指针来记录方法的执行轨迹,这样保证了从子到根的各级调用。

var user = st.klass("user", {
klassInit: function(name) {
this.name = name;
},
say: function(text) {
return this.name + ',' + text;
}
}) var user2 = st.klass('user2', {
say: function(text) {
return this.callBase('say', [text]) + "-lv2";
}
}, user); var user3 = st.klass('user3', {
say: function(text) {
return this.callBase('say', [text]) + "-lv3";
}
}, user2); var user4 = st.klass('user4', {
say: function(text) {
return this.callBase('say', [text]) + "-lv4";
}
}, user3); var roy = new user4('roy');
expect(roy._$inheirts + '').toBe('user4,user3,user2,user');
//依次执行到根,正确将当前的this对象的值输出
expect(roy.say('hello')).toBe('roy,hello-lv2-lv3-lv4'); //从3级开始执行
expect(roy.callBase('say', ['hello'])).toBe("roy,hello-lv2-lv3"); //指定从user开始执行
expect(roy.callBase('say', 'user', ['hello'])).toBe("roy,hello"); //上向略过2级执行
expect(roy.callBase('say', 2, ['hello'])).toBe("roy,hello-lv2");

smartjs 0.2 OOP讲解 - Klass 类继承的更多相关文章

  1. smartjs 0.2 OOP讲解 - factory

    本篇介绍OOP的第二个对象factory.在以往项目中其实真正使用klass的地方相当少,而factory则是十分常见的. 在smartjs中的factory并不是指的是工厂模式.在factory要求 ...

  2. smartJS 0.1 API 讲解 - FlowController

    本篇介绍0.1版中最后一个特性,FlowController:同时也对第一版总结一下,因为近两年全部都是在搞前端,都是做一些js框架类的东西,也做了不少有意思的功能,做smartjs对我来说一个是对自 ...

  3. smartJS 0.1 API 讲解 - PromiseEvent

    上篇简单的介绍smartjs了一些通用方法的api.这篇介绍基础的PromiseEvent(这个名字一直没想好,以前准备用callbacks的,但避免与jquery混淆,st的命名空间可以直接挂到$上 ...

  4. smartJS 0.1 API 讲解 - Trigger

    上篇介绍了PromiseEvent,本篇介绍Trigger - 基于Promise的aop的体现:(感觉自己的对这些命名一直都很挫,也懒得想了,所以就凑合的用) Trigger 在目标对象上加入触发器 ...

  5. Python类继承(转发)

    目录 一.概述 二.类的继承 2.1 继承的定义 2.2 构造函数的继承 2.3 子类对父类方法的重写 三.类继承的事例 回到顶部 一.概述 面向对象编程 (OOP) 语言的一个主要功能就是“继承”. ...

  6. (转载)详解7.0带来的新工具类:DiffUtil

    [Android]详解7.0带来的新工具类:DiffUtil 标签: diffutil 2017-04-17 18:21 226人阅读 评论(0) 收藏 举报  分类: Android学习笔记(94) ...

  7. C++ 类继承的对象布局

    C++多重继承下,对象布局与编译器,是否为虚拟继承都有很大关系,下面将逐一分析其中的差别,相同点为都按照类继承的先后顺序布局(类内按照虚表.成员声明先后顺序排列).该类情况为子类按照继承顺序排列,如c ...

  8. 深入理解OOP(三):多态和继承(动态绑定和运行时多态)

    在前面的文章中,我们介绍了编译期多态.params关键字.实例化.base关键字等.本节我们来关注另外一种多态:运行时多态, 运行时多态也叫迟绑定. 深入理解OOP(一):多态和继承(初期绑定和编译时 ...

  9. 深入理解OOP(二):多态和继承(继承)

    本文是深入浅出OOP第二篇,主要说说继承的话题. 深入理解OOP(一):多态和继承(初期绑定和编译时多态) 深入理解OOP(二):多态和继承(继承) 深入理解OOP(三):多态和继承(动态绑定和运行时 ...

随机推荐

  1. paip.提升性能---协程“微线程”的使用.

    paip.提升性能---协程的使用. 近乎无限并发的"微线程" 作者Attilax  艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:h ...

  2. paip.cache 缓存架构以及性能提升总结

    paip.cache 缓存架构以及性能提升总结 1         缓存架构以及性能(贯穿读出式(LookThrough) 旁路读出式(LookAside) 写穿式(WriteThrough) 回写式 ...

  3. iOS开发——高级技术&调用地图功能的实现

    调用地图功能的实现 一:苹果自带地图 学习如逆水行舟,不进则退.古人告诉我们要不断的反思和总结,日思则日精,月思则月精,年思则年精.只有不断的尝试和总结,才能让我们的工作和生活更加 轻松愉快和美好.连 ...

  4. C# 串口操作 ---- 系列文章

    C# 串口操作系列(5)--通讯库雏形 通讯库雏形的建立. 串口通讯介绍的高级篇,介绍更高级的抽象,为扩展为通用的客户端通讯库做铺垫,扩展性的考虑,能支持任意类型的流设备. ... 2010-08-0 ...

  5. Asp.Net实现FORM认证的一些使用技巧(转)

    最近因为项目代码重构需要重新整理用户登录和权限控制的部分,现有的代码大体是参照了.NET的FORM认证,并结合了PORTAL KITS的登录控制,代码比较啰嗦,可维护性比较差.于是有了以下的几个需求( ...

  6. 转: sql server2008 字段类型详解

    bit 整型 bit数据类型是整型,其值只能是0.1或空值.这种数据类型用于存储只有两种可能值的数据,如Yes 或No.True 或False .On 或Off. 注意:很省空间的一种数据类型,如果能 ...

  7. 【Vegas原创】安装rhel6.2,不能进图形化界面的终极解决方法

    安装的时候,千万不要一路下一步,you should know,linux不是windows那么的傻瓜.   方法一: 在倒数最后一步,选择Desktop,而千万不要下一步,默认选择Basic Ser ...

  8. mac os 中安装memcahed

    1.先安装macport   sudo port selfupdate  #更新当前Marport  (如果port 不可以时可以考虑此操作) sudo prot -d selfupdate #替换更 ...

  9. 解决Visual Studio 调试时候不能直接访问.json后缀文件的问题

    Web.config中作如下配置: <system.webServer> <staticContent> <mimeMap fileExtension=".js ...

  10. Mac OS 下安装wget

    环境:  Mac OS X 10.9.4 1 下载源码 地址: http://ftp.gnu.org/gnu/wget/wget-1.9.tar.gz 2 解压安装 tar zxvf wget-1.9 ...