Как расширить свойства класса

235
21 марта 2017, 13:48

Я переписываю проект с es5 на es6 и использую angular 1.6.1
Использую классы es6. Делаю вот так

function getArgs(func) {
    var args = func.toString().match(/function\s.*?\(([^)]*)\)/)[1];
    return args.split(',').map(function(arg) {
        return arg.replace(/\/\*.*\*\//, '').trim();
    }).filter(function(arg) {
        return arg;
    });
}
function extendClassConstructor(object, parameters) {
    let r = [],
        i,
        keys = getArgs(object);
    for (i = 0; i < keys.length; i++) {
        r.push({
            key: keys[i],
            value: parameters[i]
        });
    }
    angular.forEach(r, function (value, key) {
        Object.defineProperty(object, key, {
            value: value
        });
    });
}
export default class DinnerController {
    /** @ngInject */
    constructor(DinnerService, $location, $filter, $scope, DinnerFactory, PaginationFactory, $timeout, CurrencyFactory) {
        extendClassConstructor(this, arguments);
        console.log(this);
    }
}

Но вот в чем проблема, если я передаю this в extendClassConstructor, то будет ошибка
Cannot read property '1' of null
на этой строчке
var args = func.toString().match(/function\s.*?\(([^)]*)\)/)[1];
А так вообще this не расширяется
Что я не так делаю

Я вообще не имею желания так писать

this.DinnerService = DinnerService;
this.$location = $location;
this.$filter = $filter;
this.$scope = $scope;
this.DinnerFactory = DinnerFactory;
this.PaginationFactory = PaginationFactory;
this.$timeout = $timeout;
this.CurrencyFactory = CurrencyFactory;

Как одно из решений которое я придумал

class NgController {
    constructor(child, parameters) {
        let keys = this.getArgs(child);
        let r = [],
            i;
        for (i = 0; i < keys.length; i++) {
            r.push({
                key: keys[i],
                value: parameters[i]
            });
        }
        angular.forEach(r, (obj) => {
            Object.defineProperty(this, obj.key, {
                value: obj.value
            });
        });
    }
    getArgs(func) {
        let args = func.toString().match(/function\s.*?\(([^)]*)\)/)[1];
        return args.split(',').map( (arg) => {
            return arg.replace(/\/\*.*\*\//, '').trim();
        }).filter( (arg) => {
            return arg;
        });
    }
}

И в дочернем класс в конструкторе делаем так

class DinnerController extends NgController
super(DinnerController, arguments);

Но опять же, можно ли все таки расширить прототип классов и просто потом в конструкторе вызывать this.extendPropeties(arguments)
Типа так можно ?

READ ALSO
io.js не запускается из cmd в windows 10

io.js не запускается из cmd в windows 10

Суть ситуации такова: установлен iojs, установлен node

303
Классы и метод apply

Классы и метод apply

Вопрос по поводу apply: можете описать более подробно какие аргументы должны передаваться в apply и какого общее предназначение?

257
Использование fabric.js + web font loader

Использование fabric.js + web font loader

Использую fabricjs и несколько кастомных шрифтов для своего приложения

240
Реализация flex CSS на JavaScript

Реализация flex CSS на JavaScript

Подскажите есть ли реализация flex на JavaScript или с использованием препроцессоров CSS? Гуглил, не нахожу

298