美文网首页
js 重写node_modules中某个库中的某个方法

js 重写node_modules中某个库中的某个方法

作者: 谭瞎 | 来源:发表于2019-02-13 18:24 被阅读0次

需求:引用第三方库,因业务需要,需要改动代码才能满足功能,但是又不想改源码,因为本地改动的源码不会提交到git上,其他同事开发时会报错,所以只能在自己维护的业务代码中,重写第三方库的方法。

解决:在构造函数中,调用重写函数的方法

本人的业务代码如下:

// 第三方库
const xcode = require("xcode");

// 自定义的方法库
const utilFun = require("./utilFun"),

class ProjectPbxpro {
    
    constructor() {
        // 在构造函数中调用重写函数的方法
        this.overloadAddToFrameworkSearchPaths();
    }

    /**
     * 重写 addToFrameworkSearchPaths 方法
     */
    overloadAddToFrameworkSearchPaths() {
        // 拿到和第三方库相同的对象,第三方库是pbxProject,此处是xcode.project
        const pbxProject = xcode.project;
        
        pbxProject.prototype.addToFrameworkSearchPaths = function (file) {
            
            // nonComments 可以拿到第三方库写好的,放到自己好引用的位置,此处本人放置在utilFun.js中
            var configurations = nonComments(this.pbxXCBuildConfigurationSection()),
                INHERITED = '"$(inherited)"',
                config, 
                buildSettings, 
                searchPaths;
    
            for (config in configurations) {
                buildSettings = configurations[config].buildSettings;
        
                if (unquote(buildSettings['PRODUCT_NAME']) != this.productName)
                    continue;
        
                if (!buildSettings['FRAMEWORK_SEARCH_PATHS'] ||
                    buildSettings['FRAMEWORK_SEARCH_PATHS'] === INHERITED) {
                    buildSettings['FRAMEWORK_SEARCH_PATHS'] = [INHERITED];
                }
                buildSettings['FRAMEWORK_SEARCH_PATHS'].push(file);
            }
            
        }
    }
}
module.exports = ProjectPbxpro;

第三方库代码:

pbxProject.prototype.addToFrameworkSearchPaths = function (file) {
    var configurations = nonComments(this.pbxXCBuildConfigurationSection()),
        INHERITED = '"$(inherited)"',
        config, buildSettings, searchPaths;

    for (config in configurations) {
        buildSettings = configurations[config].buildSettings;

        if (unquote(buildSettings['PRODUCT_NAME']) != this.productName)
            continue;

        if (!buildSettings['FRAMEWORK_SEARCH_PATHS'] ||
            buildSettings['FRAMEWORK_SEARCH_PATHS'] === INHERITED) {
            buildSettings['FRAMEWORK_SEARCH_PATHS'] = [INHERITED];
        }
        buildSettings['FRAMEWORK_SEARCH_PATHS'].push(file);
    }
}

因为基础不牢固,折腾了一天实现的方法,希望能帮到同基础不好的你,原型链那一套真的搞不懂,实践出真知,加油!

相关文章

网友评论

      本文标题:js 重写node_modules中某个库中的某个方法

      本文链接:https://www.haomeiwen.com/subject/jqadeqtx.html