mixin-class
v3.0.5
Published
mixin style inherit
Downloads
8
Readme
mixin-class
mixin style inherit
'use strict';
var mixin = require('../index');
var assert = require('assert');
describe('mixin(opt0 ... optN) return a class', function() {
it('mixin()会返回一个构造函数', function() {
var Class = mixin();
var a = new Class()
assert(a instanceof Class);
});
it('mixin(opt0...optN)可以接受object作为参数,这些object的属性会被添加到返回的类prototype', function() {
var Class = mixin(
{
a: 1
},
{
b: 2
}
);
var o = new Class();
assert.equal(o.a, 1);
assert.equal(o.b, 2);
});
it('mixin(opt0...optN)可以接受function作为参数,这些function会在new的时候依次被调用', function() {
var Class = mixin(
function() {
this.a = 1;
},
function() {
this.b = 2
}
);
var o = new Class();
assert.equal(o.a, 1);
assert.equal(o.b, 2);
});
it('mixin(opt0...optN)可以接受class作为参数,这些class的prototype的属性会被添加到返回的类prototype,这些class的构造函数会在new的时候依次被调用', function() {
var C = function() {
this.a = 1;
}
C.prototype.b = 2;
var Class = mixin(C);
var o = new Class();
assert.equal(o.a, 1);
assert.equal(o.b, 2);
});
it('传入的function调用时会传入arguments', function() {
var Class = mixin(function(a, b) {
this.a = a;
}, function(a, b) {
this.b = b;
})
var o = new Class(1, 2);
assert.equal(o.a, 1);
assert.equal(o.b, 2);
})
it('传入的function会去重', function() {
var calledTimes = 0;
var Ctor = function() {
calledTimes++;
};
var Class = mixin(Ctor, Ctor, mixin(Ctor));
var a = new Class();
assert.equal(calledTimes, 1)
})
})
describe('mixin ctor', function() {
it('每个构造函数的返回值会作为下一个构造函数的this', function() {
var a = {};
var b = {};
var c = {};
var A = function A() {
return a;
};
var B = function B() {
assert.equal(this, a);
return b;
};
var C = function C () {
assert.equal(this, b);
return c;
}
var o = new (mixin(A, B, C))();
assert.equal(o, c)
})
});