2016-02-07 43 views
2

http://www.extjs-tutorial.com/extjs/declare-private-members-in-class-extjs的教程提供了一個在Ext JS類中聲明私有成員的例子。但我不明白這是一個私人成員的例子。在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

其實我不明白對象可變的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確實是本地的關閉,但它並不像一個成員變量了,因爲這兩個對象studentObjXstudentObjA共享相同的name。兩個警報顯示相同的名稱,即ABC

回答

2

總之:不是。

該教程顯然是錯誤的。沒有辦法在JavaScript對象中實現私有成員,因爲隱藏它們不被該語言支持。他們總是可以訪問 - 不管怎樣。

但是,該教程既沒有被開發,銷售和支持該框架的公司Sencha編寫,審查也沒有批准。

此外,沒有指定作者,沒有法律聲明,域whois出現空白。

在這些情況下,您不應該信任該頁面上的任何信息。

你甚至不能相信,ExtJS的文檔是完全正確的,更何況是匿名的第三方「教程」 ......

相關問題