Учебник на 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
.