централизовать повторяющийся код в один файл - PullRequest
0 голосов
/ 02 апреля 2019

language nodejs

У меня громоздкий код, который повторяется во многих файлах одинаково: file1.js, file2.js, file3.js, ..., каждый файл имеет свой экземпляр того же класса, единственное отличие - это экземпляр объекта,

моя ситуация напоминает этот псевдокод

    fileClass1.js
    MyClass1{
        constructor(name) {
            this.name = name;
        }    
        printName(from){
            console.log("Hello "+this.name+" from "+from)
        }
    }

    file1.js
        var obj = obj1 = new MyClass1("name1")

        //call MyClass1::printName()
        obj.printName("foo")
        obj.printName("bar")

        //methods definition 
        obj.method2 = function(){}
        obj.method3 = function(){}

    file2.js
        var obj = obj2 = new MyClass1("name2")

        //call MyClass1::printName()
        obj.printName("foo")
        obj.printName("bar")

        //methods definition 
        obj.method2(){}
        obj.method3(){}

    file3.js
        var obj = obj3 = new MyClass1("name3")

        //call MyClass1::printName()
        obj.printName("foo")
        obj.printName("bar")

        //methods definition 
        obj.method2(){}
        obj.method3(){}

    . . .

результат, который я хотел бы получить, показан ниже: файл include.js, содержащий код, который вызывает метод, и определение методов, или только один из двух, если оба невозможны

    fileClass1.js
    MyClass1{
        printName(){
            console.log("method1 Hello!")
        }
    }

    file1.js
        var obj = obj1 = new MyClass1("name1")
        require(include.js)


    file2.js
        var obj = obj2 = new MyClass1("name1")
        require(include.js)

    file3.js
        var obj = obj3 = new MyClass1("name1")
        require(include.js)

    . . .

    include.js
        //call MyClass1::printName()
        obj.printName("foo")
        obj.printName("bar")

        //methods definition 
        obj.method2(){}
        obj.method3(){}

1 Ответ

1 голос
/ 02 апреля 2019

Требование файла JS не означает, что он должен запускаться сразу, вы можете создать функцию в include.js и вызывать эту функцию позже вместо того, чтобы ее код выполнялся сразу.

Подробнее о Модули JS

// include.js
module.exports = function(obj) {
    obj.printName("foo")
    //call MyClass1::printName()
    obj.printName("foo")
    obj.printName("bar")

    //methods definition 
    obj.method2(){}
    obj.method3(){}
}

С этого момента, когда вы require('include.js'), он вернет функцию, которую можно сохранить в переменной

// file1.js
var obj = obj1 = new MyClass1("name1")
var doStuff = require('include.js')
doStuff(obj1)


// file2.js
var obj = obj2 = new MyClass1("name1")
var doStuff = require('include.js')
doStuff(obj2)

// file3.js
var obj = obj3 = new MyClass1("name1")
var doStuff = require('include.js')
doStuff(obj3)
...