Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Closure constructor не работает в strict mode (https://javascript.ru/forum/misc/80197-closure-constructor-ne-rabotaet-v-strict-mode.html)

IgorFomenko 07.05.2020 15:29

Closure constructor не работает в strict mode
 
Здравствуйте, написал простейший конструктор, который без use strict работает, а с use strict нет
'use strict'
            let Person = (function() {
                var age = 25;
                var map = new WeakMap();
                 function PersonConstructor(name) {
                    this.name = name;
                    var obj = {age};
                    map.set(this, obj);

                }
                PersonConstructor.prototype.getAge = function() {
                    return map.get(this).age
                }
                PersonConstructor.prototype.incAge = function() {
                    obj = map.get(this);
                    obj.age++;
                    map.set(this,obj);
                }
                return PersonConstructor
            }());
            let per1 = new Person('John');
            let per2 = new Person('Smith');
            per1.incAge();
            console.dir(per1.getAge())

Nexus 07.05.2020 15:38

Все работает, не вижу ошибок.

Вы в строке 15 обращаетесь к не объявленной переменной «obj».
Объект объявленный в строке 7 за пределы конструктора не выйдет, так что нужно либо его сохранять в свойство объекта «PersonConstructor», либо объявлять переменную «obj» вне конструктора.

IgorFomenko 07.05.2020 17:04

Спасибо, да, забыл let поставить перед obj в 15ой строке

IgorFomenko 07.05.2020 17:29

Еще одна проблема, почему _ функция отказывается работать
'use strict'
            let Person = (function() {
                var age = 25;
                var map = new WeakMap();
                var _ = function(inst){map.get(inst)}; //не работает
                function PersonConstructor(name) {
                    this.name = name;
                    var obj = {age};
                    map.set(this, obj);

                }
                PersonConstructor.prototype.getAge = function() {
                    return _(this).age
                }
                PersonConstructor.prototype.incAge = function() {
                    let obj = _(this);
                    obj.age++;  //не работает
                    map.set(this,obj);
                }
                return PersonConstructor
            }());
            let per1 = new Person('John');
            let per2 = new Person('Smith');
            per1.incAge();
            console.dir(per1.getAge())

IgorFomenko 07.05.2020 17:37

Допер, нужно return добавить, без него не хочет


Часовой пояс GMT +3, время: 01:55.