Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 11.11.2020, 13:21
Аватар для Ex_Soft
Профессор
Отправить личное сообщение для Ex_Soft Посмотреть профиль Найти все сообщения от Ex_Soft
 
Регистрация: 19.12.2009
Сообщений: 164

class: захват и сохранение this
Это - работает:
var ClassWithId = (function() {
    function ClassWithId(id) {
        this.id = id;
    }
    return ClassWithId;
}());

var ClassWithClosures = (function() {
    var me;

    function ClassWithClosures(id) {
        me = this;
        this.id = id;
    }

    ClassWithClosures.prototype.isMatch = function(num) {
        return (function(_num) {
            return !!me.id.id && _num % 2 === 0;
        })(num);
    };
    return ClassWithClosures;
}());

var arrayOfInt = [1, 2, 3, 4, 5, 6, 7, 8, 9];
var classWithClosure = new ClassWithClosures(new ClassWithId("blah"));
var resultOfFilter = arrayOfInt.filter(classWithClosure.isMatch);
for (var i = 0, l = resultOfFilter.length; i < l; i++) {
    if (window.console && console.log) {
        console.log(resultOfFilter[i]);
    }
}


Как заставить работать это:
class ClassWithClosuresNewStyle {
	var me; !!! error "Uncaught SyntaxError: unexpected token: identifier"

	constructor(id) {
		this.id = id;
	}
	
	isMatch(num) {
	    return(function(_num) {
		  return !!me.id.id && _num %2 === 0;
		})(num);
	}
}

var arrayOfInt = [1, 2, 3, 4, 5, 6, 7, 8, 9];
var classWithClosureNewStyle = new ClassWithClosuresNewStyle(new ClassWithId("blah"));
var resultOfFilter = arrayOfInt.filter(classWithClosureNewStyle.isMatch);
for (var i = 0, l = resultOfFilter.length; i < l; i++) {
    if (window.console && console.log) {
        console.log(resultOfFilter[i]);
    }
}

???

Ну... И... Первоисточник, така сказать, на TypeScript
class ClassWithId {
    constructor(public id?: string) {
    }
}

class ClassWithClosures {
    constructor(public id?: ClassWithId) {
    }

    public isMatch(num: number): boolean {
        const tmpId = this.id;

        return ((_id: ClassWithId, _num: number) => {
            return !!_id.id && _num % 2 === 0;
        })(tmpId, num);
    }
}

let arrayOfInt = [1, 2, 3, 4, 5, 6, 7, 8, 9];
let classWithClosure = new ClassWithClosures();
let resultOfFilter = arrayOfInt.filter(classWithClosure.isMatch);
for (let i = 0, l = resultOfFilter.length; i < l; i++) {
    if (window.console && console.log) {
        console.log(resultOfFilter[i]);
    }
}

???
__________________
"Helo, word!" - 17 errors 56 warnings
Ответить с цитированием
  #2 (permalink)  
Старый 11.11.2020, 13:37
Аватар для Ex_Soft
Профессор
Отправить личное сообщение для Ex_Soft Посмотреть профиль Найти все сообщения от Ex_Soft
 
Регистрация: 19.12.2009
Сообщений: 164

Всем спасибо - заборол:
class ClassWithClosuresNewStyle {
	constructor(id) {
		this.id = id;
	}
	
	isMatch = (num) => {
		return !!this.id.id && num %2 === 0;
	}
}
__________________
"Helo, word!" - 17 errors 56 warnings
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отключить сохранение при комбинации Ctrl + S MC-XOBAHCK Общие вопросы Javascript 8 06.04.2020 08:13
Динамические элементы формы rustleofstars Элементы интерфейса 5 18.10.2019 19:57
Выполнение <script> При определенном class ilya1099 Javascript под браузер 0 06.11.2016 23:12
Использование классов в JavaScript devote Ваши сайты и скрипты 70 01.02.2013 17:17
Как работает функция Class godofjavascript Оффтопик 58 17.12.2012 09:49