需求:引用第三方库,因业务需要,需要改动代码才能满足功能,但是又不想改源码,因为本地改动的源码不会提交到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);
}
}
因为基础不牢固,折腾了一天实现的方法,希望能帮到同基础不好的你,原型链那一套真的搞不懂,实践出真知,加油!