2010-04-28 19 views
11

Tôi đã làm một số nghiên cứu trên diễn đàn ExtJS về phương pháp riêng và các lĩnh vực bên trong một lớp mở rộng, và tôi không thể tìm thấy bất kỳ câu trả lời thực sự này.thành viên cá nhân khi mở rộng một lớp sử dụng ExtJS

Và khi tôi nói một mở rộng lớp Ý tôi là một cái gì đó như thế này:

Ext.ux.MyExtendedClass = Ext.extend(Ext.util.Observable, { 
    publicVar1: 'Variable visible from outside this class', 
    constructor: function(config) { this.addEvents("fired"); this.listeners = config.listeners; }, // to show that I need to use the base class 
    publicMethod1: function() { return 'Method which can be called form everywhere'; }, 
    publicMethod2: function() { return this.publicMethod1() + ' and ' + this.publicVar1; } // to show how to access the members from inside another member 
}); 

Vấn đề ở đây là mọi thứ đều là công khai. Vì vậy, làm cách nào để thêm phương thức biến o mới trong phạm vi MyExtendedClass không thể truy cập từ bên ngoài nhưng có thể truy cập bằng các phương thức công khai?

Trả lời

4

Tôi sử dụng một cái gì đó như sau.

var toolbarClass = Ext.extend(Ext.Container, 
    { 
    /** 
    * constructor (public) 
    */ 
    constructor: function(config) 
    { 
     config = config || {}; 

     // PRIVATE MEMBER DATA ======================================== 
     var accountId = Ext.id(null, 'ls-accountDiv-'); 

     // PUBLIC METHODS ======================================== 
     this.somePublicMethod = function(){ 
     console.log(accountId); 
     }; 

... 
+0

+1 Tính năng này hoạt động! Nhưng tôi mới nhận ra một giải pháp khác có vẻ tốt hơn. Bởi vì với giải pháp của bạn, thời gian tạo ra của mỗi trường hợp sẽ được tăng lên, và tôi tin rằng tôi không. Tôi sẽ đăng nó ngay bây giờ, để mọi người có thể nói nếu tôi sai hay không. –

+5

Tôi hoan nghênh cuộc trò chuyện này. Có thể cho rằng quá ít nhà phát triển lo ngại về việc ẩn dữ liệu khi phát triển bằng JavaScript. – Upperstage

23

Ví dụ sau đây cho thấy Upper Stage way để xác định đặc quyền riêng & thành viên nào. Nhưng nó cũng cho thấy làm thế nào để xác định thành viên tĩnh tin (còn gọi là thành viên lớp), và thành viên không có đặc quyền nào. Sử dụng những 2 thay vì những đặc quyền cuối cùng, chúng tôi sẽ giảm thời gian khởi vì chúng không phân tích cú pháp mỗi khi bạn tạo một đối tượng mới của lớp học của bạn:

Ext.ux.MyExtendedClass = Ext.extend(Ext.util.Observable, 
 
    (function() { 
 
    // private static fields (can access only to scope: minimum privileges). 
 
    var privStaticVar = 0; 
 
    // private static functions (can access only to scope and arguments, but we can send them the scope by param) 
 
    var privateFunc1 = function(me) { return me.name + ' -> ClassVar:' + privStaticVar; }; 
 
    var privateFunc2 = function(me) { return me.publicMethod1() + ' InstanceVar:' + me.getPrivateVar(); }; 
 
    return { 
 
     constructor: function(config) { 
 
     // privileged private/public members (can access to anything private and public) 
 
     var privateVar = config.v || 0; 
 
     var privInstFunc = function() { privateVar += 1; }; 
 
     this.name = config.name; 
 
     this.incVariables = function(){ privInstFunc(); privStaticVar += 1; }; 
 
     this.getPrivateVar = function(){ return privateVar; }; 
 
     }, 
 
     // public members (can access to public and private static, but not to the members defined in the constructor) 
 
     publicMethod1: function() { this.incVariables(); return privateFunc1(this); }, 
 
     publicMethod2: function() { return privateFunc2(this); } 
 
    }; 
 
    }()) 
 
); 
 

 
function test() { 
 
    var o1 = new Ext.ux.MyExtendedClass({name: 'o1', v: 0}); 
 
    var o2 = new Ext.ux.MyExtendedClass({name: 'o2', v: 10}); 
 
    var s = o1.publicMethod2() + '<br>' + o1.publicMethod2() + '<br><br>' + o2.publicMethod2() + '<br>' + o2.publicMethod2(); 
 
    Ext.get("output").update(s); 
 
}
<link href="//cdnjs.cloudflare.com/ajax/libs/extjs/3.4.1-1/resources/css/ext-all.css" rel="stylesheet"/> 
 
<script src="//cdnjs.cloudflare.com/ajax/libs/extjs/3.4.1-1/adapter/ext/ext-base.js"></script> 
 
<script src="//cdnjs.cloudflare.com/ajax/libs/extjs/3.4.1-1/ext-all.js"></script> 
 

 
<p>Click the button to instantiate 2 objects and call each object 2 times:</p> 
 

 
<button onclick="test();">Test</button> 
 

 
<p>You can click the button again to repeat. You'll see that the static variable keep increasing its value.</p> 
 

 
<p>&nbsp;</p> 
 
<div id="output"></div>

+4

điều này thường được gọi là Mô-đun Mô-đun, bạn có thể tìm thấy nó được viết trên blog YUI – seanmonstar

+1

Tôi tin rằng * privStaticVar *, * privateFunc1 * & * privateFunc2 * sẽ được phân tích cú pháp chỉ một lần (và với các bài kiểm tra tôi đã thực hiện) có kết quả đúng). Bởi vì từ khóa 'new' sẽ không ảnh hưởng đến các thành viên của mẫu mô-đun này, khi chúng được phân tích cú pháp trong khi Ext.extend được thực thi (cách trước constructor hoặc bất kỳ phương thức nào khác đi vào hiện trường). Ngoài ra, mô hình mô-đun là những người độc thân, vì vậy tôi nghĩ điều đó cũng sẽ giải thích được. –

+0

Tôi đồng ý; xin lỗi vì bình luận trước đó. – Upperstage

1

@Protron: Câu trả lời của bạn là tuyệt vời! Cảm ơn! Tôi đã đi xa hơn một chút và tạo phương pháp mở rộng lớp của riêng mình.

/** 
* Instead of call Ext.extend method to create your new class extensions, you can use 
* My.extend. It is almost the same thing, but you pass a function as body for your new class, not 
* an object. Ex.: 
* 
* MyNewExtCompoment = My.extend(Ext.Compoment, function() { 
*  var myPrivateVar = 0; 
* 
*  //private 
*  function reset() { 
*  myPrivateVar = 0; 
*  } 
* 
*  //public 
*  function add(value) { 
*  try{ 
*   myPrivateVar = myPrivateVar + value; 
*  } catch(err){ 
*   reset(); 
*  } 
*  return myPrivateVar; 
*  } 
* 
*  return { 
*   add: add 
*  } 
* }, 'ux-my-new-component'); 
* 
* @param extendedClass my extended class 
* @param newClassBodyFunction my new class body 
* @param newClassXtype (optional) the xtype of this new class 
*/ 
My.extend = function(extendedClass, newClassBodyFunction, newClassXtype) { 
    var newClass = Ext.extend(extendedClass, newClassBodyFunction.call()); 
    if(newClassXtype) { 
     Ext.reg(newClassXtype, newClass); 
    } 
    return newClass; 
} 

Bằng cách này, chúng tôi có thể lưu thêm một số "()" và chúng tôi có "Ext.reg" được gọi miễn phí. [] s

Các vấn đề liên quan