zoukankan      html  css  js  c++  java
  • 控制 "类" 库的作用域

    /**
     *  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)
  • 相关阅读:
    Vue+element UI实现“回到顶部”按钮组件
    JS判断字符串长度的5个方法(区分中文和英文)
    从vue源码看Vue.set()和this.$set()
    mac下git安装与使用
    JS数组reduce()方法详解及高级技巧
    vue中router.go、router.push和router.replace的区别
    上传及更新代码到github(以及如何在vscode上提交自己的代码)
    VSCode打开多个项目文件夹的解决方法
    get请求和post请求的区别
    android 进程的优先级
  • 原文地址:https://www.cnblogs.com/aaronjs/p/2654156.html
Copyright © 2011-2022 走看看