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

本文探讨了JavaScript中模块划分的方法及其对代码清晰度的影响,并介绍了如何通过扩展对象功能实现子函数的外部调用,提供了两种实用的实现方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我现在写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;
    }
})();

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

//图例。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;
})();

现在,因为某些原因,外部也需要使用 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();//呵呵呵呵呵呵

不要因为这个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();//呵呵呵呵呵呵

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值