• 控制 "类" 库的作用域


    /**
     *  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)
  • 相关阅读:
    mybatis 框架 的应用之四(一对一 与 一对多)
    mybatis 框架 的应用之三(操作两张没有关联的表,存在主键和外键关系)
    mybatis 框架 的应用之二(批量添加、实现分页查询)
    hibernate 框架的简单使用
    Java c3p0 连接 MySQL
    Oracle 复制表
    web 应用中访问 Spring 具体实现
    oracle 创建表 外键约束
    oracle 通过序列实现某字段自增
    Swift数组的sort、filter、forEach、map等方法,$的使用
  • 原文地址:https://www.cnblogs.com/aaronjs/p/2654156.html
Copyright © 2020-2023  润新知