smartjs 0.2 OOP讲解 - Klass 类继承

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 类继承,布布扣,bubuko.com

时间: 2024-08-26 05:19:56

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

smartjs 0.2 OOP讲解 - factory

本篇介绍OOP的第二个对象factory.在以往项目中其实真正使用klass的地方相当少,而factory则是十分常见的. 在smartjs中的factory并不是指的是工厂模式.在factory要求定义一个基础对象,这个对象可以是基类,也可以是模板对象或者是接口.然后factory就已此基础对象为基础,其他添加或者创建的对象,继承或者是复制基础对象的属性和方法.factory在提供一系列方法来对这些对象做控制. factory经过简单的处理可以实现工厂.外观.模板等设计模式. 接口说明 //多

smartJS 0.1 API 讲解 - FlowController

本篇介绍0.1版中最后一个特性,FlowController:同时也对第一版总结一下,因为近两年全部都是在搞前端,都是做一些js框架类的东西,也做了不少有意思的功能,做smartjs对我来说一个是对自己做一个总结,也希望分享一些东西给大家借鉴. 而对smartjs的来说,整体思想都并不是为了实现什么功能.特效和内容.而是希望体现一些前端编程模式或者思想上的内容,这次的0.1版本中,主要体现了一些面向切面编程.非侵入式编程.异步编程,生命周期控制的一些思想.包括后续的oop的内容,基于策略的数据管

smartJS 0.1 API 讲解 - PromiseEvent

上篇简单的介绍smartjs了一些通用方法的api.这篇介绍基础的PromiseEvent(这个名字一直没想好,以前准备用callbacks的,但避免与jquery混淆,st的命名空间可以直接挂到$上) PromiseEvent 基于事件和promise的回调管理,类似于jquery的callbacks,但具有结果传递,优先级,事件参数,promise控制等功能 接口方法 var events = st.promiseEvent(mode); events.add(name,function(e

【cocos2d-js官方文档】十八、Cocos2d-js v3.0的对象构造和类继承

在Cocos2d-JS中,对象的构造方式和Cocos2d-x一样,使用各个类的create函数来构造.在Cocos2d-JS v3.0我们还将为你带来一种传统的方式,即使用new操作符.另外,在v3.0 alpha1版本中,因为我们还没有找到较好的解决办法,所以不能继承JSB中的引擎类.但是在v3.0 alpha2中,这个问题已经解决了.由于使用new操作符,编写继承代码也更加容易了. 在这篇文档中,我们将会介绍如何使用它们,以及简要的实现原理. 1. 弃用的create函数 由于Cocos2d

smartJS 0.1 API 讲解 - Trigger

position:static(静态定位) 当position属性定义为static时,可以将元素定义为静态位置,所谓静态位置就是各个元素在HTML文档流中应有的位置 podisition定位问题.所以当没有定义position属性时,并不说明该元素没有自己的位置,它会遵循默认显示为静态位置,在静态定位状态下无法通过坐标值(top,left,right,bottom)来改变它的位置. position:absolute(绝对定位) 当position属性定义为absolute时,元素会脱离文档流

JS 类继承 原型继承

参考文档:JS原型继承和类继承 <script src="jquery-2.0.3.js"> </script> <script> /*//类继承 var father=function(){ this.age=53; this.say=function(){ console.log("name:"+this.name+",age:"+this.age); } }; var child=function(){

玩转JavaScript OOP[3]&mdash;&mdash;彻底理解继承和原型链

概述 首先,我们简单描述一下继承的概念:当一个类和另一个类构成"is a kind of"关系时,这两个类就构成了继承关系.继承关系的双方分别是子类和基类,子类可以重用基类中的属性和方法. 上一篇我们介绍了通过构造函数和原型可以实现JavaScript中的"类",由于构造函数和原型是对象,所以JavaScript的"类"本质上也是对象.这一篇我们将介绍JavaScript中的一个重要概念原型链,以及如何经原型链实现JavaScript中的继承.

【Android】详解7.0带来的新工具类:DiffUtil

一 概述 DiffUtil是support-v7:24.2.0中的新工具类,它用来比较两个数据集,寻找出旧数据集->新数据集的最小变化量. 说到数据集,相信大家知道它是和谁相关的了,就是我的最爱,RecyclerView. 就我使用的这几天来看,它最大的用处就是在RecyclerView刷新时,不再无脑mAdapter.notifyDataSetChanged(). 以前无脑mAdapter.notifyDataSetChanged()有两个缺点: 不会触发RecyclerView的动画(删除.

黑马程序员---java基础-Java类 继承&amp;抽象&amp;接口

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.继承 继承是所有OOP语言不可缺少的部分,在java中使用extends关键字来表示继承关系.当创建一个类时,总是在继承,如果没有明确指出要继承的类,就总是隐式地从根类Object进行继承.比如下面这段代码: 1 class Person { 2 public Person() { 3 4 } 5 } 6 class Man extends Person { 7 public Man()