关键词搜索

源码搜索 ×
×

修改函数原型prototype,使内部函数可被外界使用

发布2017-11-10浏览1464次

详情内容

我现在写javascript,喜欢一块块的,以得到较为明晰的结构和良好的区隔性。比如:

//块一
(function(){
    var a,b;
    function f1(){
        return a + b;
    }
    function f2(){
        return a - b;
    }
})();

//块二
(function(){
    var a,b;
    function f1(){
        return a * b;
    }
    function f2(){
        return a / b;
    }
})();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

但有时,重用性又会受到些影响,万一其中的子函数要被外部使用呢?比如:

//图例。arcgis for js里面的图例
var legend = (function () {
    var legend = new Legend({
        map: map,
        layerInfos: []
    }, "LegendContDiv");
    legend.startup();

    function legendClose() {
        $("#expandDiv").removeClass("toClose").addClass("toOpen");
        $("#LegendContDiv").css("display", "none");
        $("#divLegend").css("width", "18px");
        $("#divLegend").css("height", "18px");
    }

    return legend;
})();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

现在,因为某些原因,外部也需要使用 function legendClose() ,怎么办?如何写得简洁漂亮些?

十月革命一声炮响,**送来了prototype。

可以这样:

//图例
var legend = (function () {
    var legend = new Legend({
        map: map,
        layerInfos: []
    }, "LegendContDiv");
    legend.startup();

    function legendClose() {
        $("#expandDiv").removeClass("toClose").addClass("toOpen");
        $("#LegendContDiv").css("display", "none");
        $("#divLegend").css("width", "18px");
        $("#divLegend").css("height", "18px");
    }

    Legend.prototype.close = function () {//<-----------
        legendClose();
    };

    return legend;
})();

legend.close();//呵呵呵呵呵呵
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

不要因为这个legend是个arcgis对象就特别照顾它,修改prototype,它一样乖乖就范。


2017.11.13

其实呢,要扩展对象legend功能,不一定要修改其原型,直接修改它自己就行了。

//图例
var legend = (function () {
    var legend = new Legend({
        map: map,
        layerInfos: []
    }, "LegendContDiv");
    legend.startup();

    function legendClose() {
        $("#expandDiv").removeClass("toClose").addClass("toOpen");
        $("#LegendContDiv").css("display", "none");
        $("#divLegend").css("width", "18px");
        $("#divLegend").css("height", "18px");
    }

    legend.close = function () {//<-----直接修改legend本身
        legendClose();
    };

    return legend;
})();

legend.close();//呵呵呵呵呵呵
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

修改原型,那么所有new出来的对象都会更改;如果不想影响其他对象,直接修改本对象也是可以的。视情况选用。

相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载