Как локальная переменная в замыкании является частной переменной-членом в Ext JS?

Учебник на http://www.extjs-tutorial.com/extjs/declare-private-members-in-class-extjs предоставляет пример объявления закрытых членов в классах Ext JS. Но я не понимаю, как это пример частных членов.

Вот код, который я написал, очень похож на код в ссылке выше. Единственное отличие состоит в том, что в моем коде есть полный HTML-код для демонстрации кода JavaScript, и в нем есть дополнительный оператор, который пытается предупредить предположительно закрытую переменную-член с именем name.

<!DOCTYPE html>
<html>
<head>
<title>Ext-JS Private Problem</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/extjs/6.0.0/ext-all.js"></script>
<script>
Ext.define('Student', function(){
    var name = 'unnamed';

    return {
        constructor : function(name){
            this.name = name;
        },
        getName : function(){
            alert('Student name is ' + this.name);
        }
    };
});

//create an object of Student class
var studentObj = Ext.create('Student','XYZ');
studentObj.getName();
alert(studentObj.name);
</script>
</head>
<body>
</body>
</html>

Оба предупреждения в этом коде выполняются успешно. На самом деле финальное оповещение успешно отображает XYZ.

На самом деле, я не понимаю, как объект vaiable this.name вообще связан с локальной переменной name замыкания? Это совершенно две разные вещи.

Как тогда код в учебнике является демонстрацией частной переменной?

Я думал, что, возможно, учебник имел в виду что-то вроде этого.

<!DOCTYPE html>
<html>
<head>
<title>Ext-JS Private Problem</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/extjs/6.0.0/ext-all.js"></script>
<script>
Ext.define('Student', function(){
    var name = 'unnamed';

    return {
        constructor : function(n){
            name = n;
        },
        getName : function(){
            alert('Student name is ' + name);
        }
    };
});

//create an object of Student class
var studentObjX = Ext.create('Student','XYZ');
var studentObjA = Ext.create('Student','ABC');
studentObjX.getName();
studentObjA.getName();
</script>
</head>
<body>
</body>
</html>

В этом случае переменная name действительно является локальной по отношению к замыканию, но она больше не ведет себя как переменная-член, поскольку оба объекта studentObjX и studentObjA совместно используют один и тот же name. Оба предупреждения отображают одно и то же имя, то есть ABC.


person Lone Learner    schedule 07.02.2016    source источник


Ответы (1)


Короче: это не так.

Учебник откровенно неправильный. Невозможно реализовать закрытые члены в объектах JavaScript, потому что скрытие их не поддерживается языком. Они всегда доступны - так или иначе.

Но тогда учебник не написан, не проверен и не одобрен Sencha, компанией, которая разрабатывает, продает и поддерживает фреймворк.

Кроме того, нет ни имени автора, ни юридического уведомления, а домен whois остается пустым.

В этих обстоятельствах вы не должны доверять информации на этой странице.

Вы даже не можете доверять тому, что документы ExtJS полностью верны, не говоря уже об анонимных сторонних "учебниках"...

person Alexander    schedule 09.02.2016