• js中什么时候回考虑用call或者apply


    这里我说出自己的浅薄的理解,希望大家可以共鸣!

    call一些装逼的用法:

    call的用法通常在两个地方会用到,

    1.需要加一个层的时候,也可以不准确的说继承的时候,继承是继承父类的属性或者方法,而aop面向切面的思想中,我们可以清晰的感到,加层的好处,如果在js的代码中,我们开始考虑用加一个层做一些统一的额外操作,或者额外的功能的时候,可能用call.

    2.还有一个地方,就是我们通常,喜欢封装一个class或者object对象,比如类a或者b,当a调用b后,在b中可能会有很多的操作用到a中的对象属性,或者方法,这个时候我们希望极少的传入一个this或者一个obj,就可以操作一个这个对象内部的所有的东西,这个时候就会考虑用call.

    3. 也可以说是2的补充,当我们的代码是

      var ad = {

     a:function(){

     var self = this;  

    },

    b:function(){

    var self = this;

    self.a();

    }

    }

    在别的地方调用ad.b()会发生作用于错乱的情况,如果用ad.b.call(ad);这样子就避免了,域的错乱

    举例:

    1.加一个层

    //BaseModel
    'use strict';
    function BaseModel() {
        this.Members = {};
    }
    BaseModel.prototype.init = function (obj) {
        if (obj && typeof obj == 'object') {
            for (var key in this.Members) {
                if (typeof obj[key] != 'undefined') {
                    if (typeof this.Members[key].default != 'undefined') {
                        this[key] = obj[key] || this.Members[key].default;
                    } else {
                        this[key] = obj[key];
                    }
                } else {
                    this[key] = this.Members[key].default || "";
                }
            }
        } else if (arguments.length > 1) {
            this.initWithData.apply(this, arguments);
        }
    };
    BaseModel.prototype.ado = function () {
        var ado = this;
        delete ado.Members;
        return ado;
    };
    BaseModel.prototype.ado = function () {
        var ado = this;
        delete ado.Members;
        return ado;
    };
    //order.js
    function Order() {
        this.Members = {
            'id': {},
            'name': {},
            'ad_id': {},
            'description': {},
            'platform': {},
            'platformName': {},
            'adName': {},
            'deliverType': {
                'default': 'auto'
            },
            'startTime': {},
            'duration': {},
            'endTime': {},
            'state': {},
            'creator': {},
            'createtime': {},
            'streams': {},
            'albums': {},
            'videos': {},
            'targetType': {},
            'target_type':{},
            'target_catelog':{},
            'updater': {},
            'updatetime': {},
            'pushstate': {},
            'offset': {},
            'groupId': {},
            'isCopy':{},
            'copyFrom':{},
            'editAfterCopy':{},
            'orderType':0,   //是否是打点订单,0表示普通订单,1表示可视化打点订单
            'coordinate':{} //可视化打点的坐标,x距视频左端的百分比,y是距视频顶端的百分比,这里是序列化后的json字符串
        };
        this.init.apply(this, arguments);
    }
    function Order_Targeting() {
        this.Members = {
            'id': {},
            'order_id': {},
            'target_catelog':{},    
            'target_type': {},    
            'target_value': {},
            'createtime': {},
            'operator': {},
            'parent_id': {}
        };
        this.init.apply(this, arguments);
    }
    Order.prototype = {
        insert: function () {
            return Order.insert(this);
        },
        update: function () {
            return Order.update(this);
        },
        pushState: function () {
            return Order.push2Redis(this);
        }
    };

      

    Order.findAll = function (gid) {
        var deferred = Q.defer();
        var sql = SELECT_ALL, values = [];
        if (gid) {
            sql = SELECT_ALL_GID;
            values = [gid];
        }
        pool.query(sql, values, function (err, reply) {
            if (err) {
                deferred.reject(err);
            } else {
                var arr = [];
                if (reply) {
                    reply.forEach(function (n) {
                        arr.push(new Order(n).ado());
                    })
                }
                deferred.resolve(arr);
                ;
            }
        });
        return deferred.promise;
    };
    

      

    2.

  • 相关阅读:
    关于C++中的友元函数的总结
    一个使用动态链接库资源出错的难题
    如何在对话框中实现文件拖放功能
    VS2005设置可以在Release模式下调试 .
    6 Tips for Managing Property Files with Spring
    Linux命令行下SSH端口转发设定笔记_leo_百度空间
    Array properties in Spring Framework
    关于前端产品呈现形态及早期推进
    不要等离别的再珍惜,过好每一天啊
    Django snippets: uuid model field
  • 原文地址:https://www.cnblogs.com/coding4/p/5964726.html
Copyright © 2020-2023  润新知