基类方法
####在阿拉蕾那里改造过来的一个创建类的方法,已用到实际的生成项目中
define(function(require,exports,module){
function Class(o) {
//把之前的函数转换
if (!(this instanceof Class) && isFunction(o)) {
return classify(o)
}
}
Class.create=function(obj){
function subClass(){
if(this.constructor===subClass && this.initialize){
this.initialize.apply(this,arguments);
}
}
//真正创建
implement.call(subClass,obj);
//暴露静态方法
return classify(subClass);
}
function classify(cls){
//继承
cls.extend=Class.extend;
//扩展
cls.implement=implement;
return cls;
}
function implement(proto){
var key, value;
for(key in proto){
value=proto[key];
if(Class.Mutators.hasOwnProperty(key)){
Class.Mutators[key].call(this, value)
}else{
this.prototype[key]=value;
}
}
}
Class.extend = function(properties) {
properties || (properties = {})
properties.Extends = this
return Class.create(properties)
}
Class.Mutators={
'Extends':function(parent){
var existed = this.prototype;
var proto = createProto(parent.prototype);
mix(proto,existed);
proto.constructor = this;
this.prototype=proto;
//经典
this.superclass=parent.prototype;
},
'Implements': function(items) {
isArray(items) || (items = [items])
var proto = this.prototype, item
while (item = items.shift()) {
mix(proto, item.prototype || item)
}
},
'Statics': function(staticProperties) {
mix(this, staticProperties)
}
}
function Ctor() {
}
var createProto = Object.__proto__ ?
function(proto) {
return { __proto__: proto }
} :
function(proto) {
Ctor.prototype = proto
return new Ctor()
}
// Helpers
// ------------
function mix(r, s, wl) {
// Copy "all" properties including inherited ones.
for (var p in s) {
if (s.hasOwnProperty(p)) {
if (wl && indexOf(wl, p) === -1) continue
// 在 iPhone 1 代等设备的 Safari 中,prototype 也会被枚举出来,需排除
if (p !== 'prototype') {
r[p] = s[p]
}
}
}
}
var toString = Object.prototype.toString
var isArray = Array.isArray || function(val) {
return toString.call(val) === '[object Array]'
}
var isFunction = function(val) {
return toString.call(val) === '[object Function]'
}
var indexOf = Array.prototype.indexOf ?
function(arr, item) {
return arr.indexOf(item)
} :
function(arr, item) {
for (var i = 0, len = arr.length; i < len; i++) {
if (arr[i] === item) {
return i
}
}
return -1
}
module.exports = Class
})
demo:
var Animal=Class.create({
name:"动物",
run:function(){
console.log("我会跑步");
}
})
var Pig = Class.create({
Extends:Animal,
initialize: function(name) {
console.log(Pig.superclass.name);
},
talk: function() {
console.log('我是' + this.name);
}
});
var a=new Pig("猪");
a.run();