我的类库功能预览 ruby风格的继承机制
创建一个新类,使用dom.factory方法,很明显它是一个工厂方法,批量生产各种各式的类。
var MyFirstClass = dom.factory({
message: "hello world",
sayHello: function() {
alert(this.message);
}
});
var obj = new MyFirstClass();
obj.sayHello();//hello world
继承:
var Animal = dom.factory({
init: function(name) {
this.name = name;
},
eat: function() {
alert('yummie');
}
});
var Human = dom.factory({
inherit: Animal,
speak: function() {
alert(this.name + ' said bla bla bla');
}
});
var peter = new Human('peter');
peter.eat();//yummie
peter.speak();//peter said bla bla bla
var Pat = dom.factory({
inherit: Human,//注意这里,使用inherit方法
init: function(name,age) {
this.age = age
}
});
var pat = new Pat('pat',18);
alert(pat.name)//pat
alert(pat.age)//18
pat.speak();//pat said bla bla bla
方法链。就是在当前方法调用其父类的同名方法。
var Girl = dom.factory({
sayHello: function() {
return "Hello there";
}
});
var FancyGirl = dom.factory( {
inherit:Girl,
sayHello: function() {
return "Well, "+ this.$super() +"!";
}
});
var g = new Girl;
alert(g.sayHello());
var f = new FancyGirl;
alert(f.sayHello());
内部方法:
dom.require("lang");
dom.require("oop")
var Person = dom.oop({
init: function(name){
this.name = name;
},
secret: function(){
return 'I sometimes like girly drinks';
}.protect(), //定义其为内部方法,只能内部调用
describe: function(){
return "Hi, I'm #{name}. #{secret}. I kid, I kid.".instead({
name: this.name,
secret: this.secret()
});
}
});
var scott = new Person('司徒正美');
// alert(scott.secret());//报错 The method "secret" cannot be called.
alert(scott.describe());//Hi, I'm Scott. I sometimes like girly drinks. I kid, I kid.
singleton,标识生产的新类为单例类:
var God = dom.factory({
init:function(name){
this.name = name;
this.alertName = function(){
alert(this.name)
}
},
singleton:true//注意这里,使用singleton属性
});
var god = new God("耶和华");
god.alertName(); //alerts 耶和华
var lucifer = new God("撒旦");
lucifer.alertName(); //alerts 耶和华
alert(god === lucifer )//alerts true
alias,别名机制:
var Array2 = dom.factory({
init:function(){
var args = [].slice.call(arguments);
this.setArray(args);
},
setArray: function (arr) { //把普通对象变成类数组对象,
this.length = 0; //必须要让它成为原型方法才可以使用
[].push.apply(this, arr);
return this;
},
toString: function () { //返回一个字符串
return [].slice.call(this).toString();
},
valueOf: function () {//获得里面的数组对象
return [].slice.call(this);
},
pop:[].pop,
push:[].push,
shift:[].shift,
unshift:[].unshift,
reverse:[].reverse,
indexOf: function(el,index){
var n = this.length,
i = index == null ? 0 : index < 0 ? Math.max(0, n + index) : index;
for (; i < n; i++)
if (i in this && this[i] === el) return i;
return -1;
}
});
Array2.alias("indexOf","contains")
var a = new Array2(1,2,3,4,5);
alert(a)//测试toString方法
alert(a.indexOf(3))
alert(a.contains(3))//测试别名机制
include,包含,类似ruby,添加原型成员。
var movable = {
run:function(){
alert("能跑")
},
fly:function(){
alert("能飞")
}
}
var recognition ={
watch:function(){
alert("看东西")
},
smell:function(){
alert("能嗅东西")
}
}
var Robot = dom.factory({
init:function(name,type){
this.name = name;
this.type = name;
},
include:[movable,recognition]
});
var chi = new Robot("小叽","Chobits") ;
alert(chi.name);
chi.watch();
chi.fly();
extend,扩展,类似ruby,添加类成员。
var MyClass = dom.factory({});
MyClass.extend({
PI:"3.14",
alert:function(){
alert("这是静态(类)方法")
},
alertPI:function(){
alert(MyClass.PI);
}
});
MyClass.alert();//这是静态(类)方法
MyClass.alertPI();//3.14
var m = new MYClass
m.alert()//报错MYClass is not defined
自扩展与自包含:
var Module = {
selfIncluded: function(klass) {
klass.prototype.boo = 'boo';
},
selfExtended: function(klass) {
klass.BOO = 'BOO';
}
};
var MyClass = dom.factory({
include: Module,
extend: Module
});
alert(MyClass.prototype.boo); // -> 'boo'
alert(MyClass.BOO); // -> 'BOO'
dom.geometry = {};
var Point = dom.geometry.Point = dom.factory({
init: function(x, y) {
this.x = x*1.0 || 0.0;
this.y = y*1.0 || 0.0;
},
toString: function() {
return this.x + ' ' + this.y;
},
clone: function() {
return new Point(this.x, this.y);
},
eq: function(point) {
return this.x == point.x && this.y == point.y;
},
//移动点到新的位置
offset: function(x, y) {
if (typeof x === 'object') {
y = x.y;
x = x.x;
}
this.x += x;
this.y += y;
return this;
},
extend:{
fromString : function(string) {
var parts = string.split(/\s+/);
return new Point( parts[0], parts[1] );
}
}
});
添加原型成员。
var movable = {
run:function(){
p("能跑")
},
fly:function(){
p("能飞")
}
}
var recognition ={
watch:function(){
p("看东西")
},
smell:function(){
p("能嗅东西")
}
}
var Robot = oop({
init:function(name,type){
this.name = name;
this.type = name;
},
include:[movable,recognition]
});
var chi = new Robot("小叽","Chobits") ;
p(chi.name);
chi.watch();
chi.fly();
机器瞎学/数据掩埋/模式混淆/人工智障/深度遗忘/神经掉线/计算机幻觉/专注单身二十五年
浙公网安备 33010602011771号