Fork me on GitHub

控制 "类" 库的作用域

/**
 *  1 .函数调用返回时undefinde ,执行上下文是window
 *  2. new 构造,执行上下文从全局对象变成一个空的上下文,这个上下文代表新生的实列
 *     因此this关键字指向当前的实例
 *
 *  3. 默认情况下,构造函数没有返回,默认返回this,否则返回任意非原始的类型值
 *
 * **/

//兼容bind方法
if (!Function.prototype.bind) {
    Function.prototype.bind = function (obj) {
        var slice = [].slice,
            args = slice.call(arguments, 1),
            self = this,
            nop = function () {
            },
            bound = function () {
                return self.apply(this instanceof nop ? this : (obj || {})),
                    args.concat(slice.call(arguments));
            };
        nop.prototype = self.prototype;
        bound.prototype = new nop();

        return bound;
    }
}

var Class = function (parent) {
    var klass = function () {
        this.init.apply(this, arguments);
    }

    if (parent) {
        /**
         *  所有的子类都共享了同一个原型
         *  避免在继承类的时候创建实例,只有实例的属性才会被继承
         *  而非类的属性,设置对象的__proto__
         * **/
        var ctor = function () {
        };
        ctor.prototype = parent.prototype;
        klass.prototype = new ctor;
    }


    klass.prototype.init = function () {

    }

    //prototype别名
    klass.fn = klass.prototype;

    //定义类的别名
    klass.fn.parent = klass;

    //保持父类引用
    klass.__super__ = klass.__proto__;

    //保持作用域
    klass.fn.proxy = klass.proxy = function (func) {
        var self = this;
        return (function () {
            return func.apply(self, arguments);
        });
    }

    //给类添加属性
    klass.extend = function (obj) {
        var extended = obj.extended;
        for (var i in obj) {
            klass[i] = obj[i];
        }
        if (extended) extended(klass);
    }

    //给实列添加属性
    klass.include = function (obj) {
        var included = obj.included;
        for (var i in  obj) {
            klass.fn[i] = obj[i];
        }
        //触发回调
        if (included) included(klass);
    }


    return klass;
}

var Animal = new Class;

Animal.include({
    breath:function () {
        console.log("breath")
    }
})

var Cat = new Class(Animal)

var tommy = new Cat;

console.log(Animal)
posted on 2012-08-24 14:23  【艾伦】  阅读(390)  评论(0编辑  收藏  举报