var A = Class('A', Object)
.method('constructor', function(){
this.name = 'a';
});
var B = Class('B', A);
B.method('run', function(){
console.log('run');
});
var C = B.extend('C')
.method('run', function(a){
console.log('run a: ', a);
})
.method('run', function(a,b){
console.log('run a, b: ', a, b);
});
var c = C();
c.run();
c.run(1);
c.run(1,2);
https://github.com/bramblex/BlxClass
一个 JavaScript 面对对象的库,让你在 JavaScript 用上靠谱的面对对象特性。
将本项目中的 dist/Class.js
复制到你的项目下
var Class = require('path/to/Class.js');
var ClassA = Class('ClassA', Object);
<script src="path/to/Class.js"></script>
<script>
var ClassA = Class('ClassA', Object);
</script>
Class 函数接受两个参数返回一个新类,第一个参数是新类的命名,第二个参数是继承自哪个类。如果并没有继承自别的类,那么直接写 Object 就好了。
var ClassA = Class('ClassA', Object);
var ClassB = Class('ClassB', ClassA);
类的名字
var ClassA = Class('ClassA', Object);
console.log(ClassA.name) // => ClassA
var ClassB = Class('some name', ClassA);
console.log(ClassB.name) // => some name
类的父类
var ClassA = Class('ClassA', Object);
ClassA.parent === Object; // => true
var ClassB = Class('ClassB', ClassA);
ClassB.parent === ClassA; // => true
定义方法,方法会被子类继承,并且能够重载。
var ClassA = Class('ClassA', Object)
.method('constructor', function(){
// 构造函数
this.name = 'no name';
})
.method('constructor', function(name){
// 重载构造函数
this.name = name;
})
.method('run', function(){
// 普通方法
console.log('run');
})
.method('run', function(a,b){
// 重载上面定义的 run 方法
console.log('run a, b: ', a, b);
})
.method('run', '*', function(){
// 其他任意参数的情况
console.log(arguments);
});
var a = ClassA();
var b = ClassA('Li Lei');
console.log(a.name); // => no name
console.log(b.name); // => Li Lei
a.run(); // => run
a.run(1,2); // => run a, b: 1 2
a.run(4,5,6); // => [4,5,6]
a.run(7,8,9,0,1,2,3); // => [7,8,9,0,1,2,3]
定义类方法,类方法不会被子类继承,也不能重载。
var ClassA = Class('ClassA', Object)
.classmethod('run', function(){
// 类方法
console.log('class method run');
});
ClassA.run(); // => class method run
继承出新类。
var ClassA = Class('ClassA', Object);
// 下面两种写法是等价的
var ClassB = Class('ClassB', ClassB);
var ClassB = ClassA.extend('ClassB');
给方法取别名
var ClassA = Class('ClassA', Object)
.method('run', function(){
// 普通方法
console.log('run');
});
ClassA.alias('aliasRun', 'run');
var a = ClassA();
a.run(); // => run
a.aliasRun(); // => run
a.run === a.aliasRun; // => true
调用父类方法
var ClassA = Class('ClassA', Object)
.method('run', function(){
// 普通方法
console.log('ClassA run');
});
var ClassB = ClassA.extend('ClassB')
.method('run', function(){
ClassB.uper('run').apply(this, arguments);
console.log('ClassB run');
});
var ClassC = ClassB.extend('ClassC')
.method('run', function(){
ClassC.uper('run').apply(this, arguments);
console.log('ClassC run');
});
var c = ClassC();
a.run();
// => ClassA run
// => ClassB run
// => ClassC run
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.