$pcode.DefineClass如其名就是定义类,它提供如下方法
$pcode.DefineClass(ClassB, ClassC) //定义开始, 支持扩展已有的类 .Extend(ClassD, ClassE) //扩展已有的类 .Static({}) //定义静态属性和方法 .Event({}) //定义事件 .DefineGroup("privateClassA", {}) //定义分组 .Define({}) //定义类的属性和方法 .Init(function () { }) //类的初始方法 //.ReturnDefine(); //返回类的定义 .Class("ClassA"); //直接生成一个类
一,定义类,开始:
$pcode.DefineClass() .Define({ helloWrod: function () { console.log("helloWrod"); } }) .Class("ClassA"); var objA = new ClassA(); objA.helloWrod();
二,类的初始化:
$pcode.DefineClass() .Define({ name: "", helloWrod: function () { console.log("helloWrod:" + this.name); } }) .Init(function () { this.name = "ClassA"; this.helloWrod(); }) .Class("ClassA"); new ClassA();
三,类的静态
$pcode.DefineClass() .Static({ helloWrod: function () { console.log("helloWrod"); } }) .Class("ClassA"); ClassA.helloWrod();
四,类的扩展, javascript里的不要有继承的思想, 只能有扩展的思想
原因是javascript里没有私有、保护等属性, 但private, public等为保留内容(最好不要用它)
$pcode.DefineClass() .Define({ name: null, helloWrod: function () { console.log("helloWrod: " + this.name); } }) .Init(function () { this.name = "ClassA"; }) .Class("ClassA"); $pcode.DefineClass(ClassA) .Init(function () { this.name = "ClassB"; }) .Class("ClassB"); var objA = new ClassA(); var objB = new ClassB(); objA.helloWrod(); objB.helloWrod(); //原型一些支持 console.log([objB.isConstructorOf(ClassA), objB.isConstructorOf(ClassB), objB.isConstructorOf(Object)]); //结果:[true, true, true]
五,调用扩展的方法baseApply、baseCall
$pcode.DefineClass() .Define({ name: null, helloWrod: function () { console.log("helloWrod: " + this.name); } }) .Init(function () { this.name = "ClassA"; }) .Class("ClassA"); $pcode.DefineClass(ClassA) .Init(function () { this.name = "ClassB"; //调用扩展的方法有以下两种 //this.baseApply("init", 0, arguments); this.baseCall("init", 0, "testCall"); //0为调用第零个扩展方法, 原因支持多个扩展 //由于调用了ClassA的init方法 //this.name == "ClassA" }) .Class("ClassB"); var objA = new ClassA(); var objB = new ClassB(); objA.helloWrod(); objB.helloWrod();
六,定义分组, 由于javascript没有私有等属性, 我们就要定义一些规则代替, 如有一些浏览器就会在变量前后添加"__"(如:__proto__) ,这里
我规则就是分组:
$pcode.DefineClass() //我可定义ClassA的私有, 由于我为自己规定不是公用的, 所以以后可以随便修改和维护 .DefineGroup("privateClassA", { name: null }) .Define({ helloWrod: function () { console.log("helloWrod: " + this.privateClassA.name); } }) .Init(function () { this.privateClassA.name = "ClassA"; }) .Class("ClassA"); new ClassA().helloWrod();
七,分组对实体的调用, 由于分组为一个属性对象, 所以分组里this只能分组自己了, 看如下:
$pcode.DefineClass() .DefineGroup("privateClassA", { name: null, helloWrod: function () { //调用实体的helloWrod this.$this().helloWrod(); } }) .Define({ helloWrod: function () { console.log("helloWrod: " + this.privateClassA.name); } }) .Init(function () { this.privateClassA.name = "ClassA"; this.privateClassA.helloWrod(); }) .Class("ClassA"); new ClassA();
八,实现事件
$pcode.DefineClass() .Event({ //定义onSayHello事件, 当然你可以直接用on方法定义, 但如果为了可提示就要显式定义 onSayHello: function (callback) { /// <summary> /// onSayHello(sender) /// </summary> /// <param name="callback"></param> /// <returns type=""></returns> this.on("onSayHello", callback); return this; } }) .Define({ helloWrod: function () { console.log("helloWrod"); //确发事件, 并传入实体sender this.Event.trigger("onSayHello", this); } }) .Class("ClassA"); var objA = new ClassA(); //添加一个事件 objA.Event.onSayHello(function (sender) { console.log("On Event helloWrod"); }); objA.helloWrod();
九,类的释放机制实现,dispose, onDispose
$pcode.DefineClass() .Init(function () { var $obj = this; //自带onDispose事件, 释放时调用 this.Event.onDispose(function () { $obj = null;//断开$obj console.log("onDispose"); }); }) .Class("ClassA"); var objA = new ClassA(); objA.dispose();//dispose不会自动调用, 要手动调用
十,自动释放?
$pcode.DefineClass() .Init(function () { var $obj = this; //自带onDispose事件, 释放时调用 this.Event.onDispose(function () { $obj = null; //断开$obj console.log("onDispose"); }); //连接到Dom, 当Dom给删除这里会自动调用dispose方法 //this.linkToDom(window); //返回一个linkdom对象支持unlink和disconnect this.linkToDom("div:first"); }) .Class("ClassA"); var objA = new ClassA(); $("div:first").remove();//删除dom
下一节我会演示$pcode.Class实现类文件之间的定义引用
$pcode.Class("Main", ["ClassTest.ClassA"], function () { console.log("Main"); return $pcode.DefineClass() .Init(function () { }) .ReturnDefine(); });
开发时智能提示 :
开源位置:https://github.com/winpzs/pcode