2012-08-15 39 views
6

Ai đó có thể giải thích hành vi này cho tôi. Cho phép khai báo một lớp:Hành vi thừa kế ExtJs

Ext.define('baseClass',{ 
    a:null, 
    ar:[], 

    add:function(v) { 
     this.ar.push(v); 
    }, 
    sayAr:function() { 
     console.log(this.ar); 
    }, 

    setA:function(v) { 
     this.a= v; 
    }, 
    sayA:function() { 
     console.log(this.a); 
    } 
}); 

Bây giờ tôi tạo ra hai đối tượng

var a = Ext.create('baseClass'); 
var b = Ext.create('baseClass'); 

Kiểm tra tài sản

a.setA(1); 
b.setA(2); 

a.sayA(); 
b.sayA(); 

này kết quả đầu ra

1 
2 

Mọi thứ đều OK, nhưng

a.add(1); 
b.add(2); 

a.sayAr(); 
b.sayAr(); 

Chúng tôi nhận được

[1,2] 
[1,2] 

này tôi không hiểu. Tại sao nó sử dụng các thuộc tính "a" riêng biệt nhưng một mảng "ar" cho cả hai đối tượng. "ar" không được khai báo là tĩnh! Tôi không hiểu gì cả.

Trả lời

8

Khi bạn đặt thứ gì đó vào khai báo lớp, nó có nghĩa là nó được đẩy lên nguyên mẫu đối tượng (đọc: nó được chia sẻ trên tất cả các trường hợp). Nó không thực sự là một vấn đề cho chuỗi/số/bools, nhưng đối với các đối tượng và mảng bạn sẽ thấy hành vi này có hiệu lực.

Nếu bạn muốn có một mảng/đối tượng mỗi trường hợp, sau đó bạn cần phải thêm một cách rõ ràng trong trường hợp:

Ext.define('baseClass',{ 
    a:null, 

    constructor: function(){ 
     this.ar = []; 
    } 

    add:function(v) { 
     this.ar.push(v); 
    }, 
    sayAr:function() { 
     console.log(this.ar); 
    }, 

    setA:function(v) { 
     this.a= v; 
    }, 
    sayA:function() { 
     console.log(this.a); 
    } 
}); 
+0

Cảm ơn bạn, bạn có thể vui lòng làm rõ lý do tại sao nó hoạt động khác với chuỗi/số/bool – mik

+0

Nó không phân biệt, chỉ là mảng/đối tượng là loại "tham chiếu". –

+1

chuỗi/số/bool là các kiểu dữ liệu không thay đổi. Cách duy nhất để thao tác giá trị là gán lại một giá trị mới cho thuộc tính thích hợp, mà trong hầu hết các trường hợp sẽ áp dụng giá trị mới làm thành viên của cá thể cụ thể ('this.a =" mystring "'). Nguyên mẫu (được chia sẻ) sẽ vẫn bị ảnh hưởng. – mistaecko

3

Đó là bởi vì các bit này ở đây:

Ext.define('baseClass',{ 
    a:null, 
    ar:[], <--------------------------- you're instantiating an array object! 

Để làm nó rõ ràng hơn, mã trên tương đương với:

Ext.define('baseClass',{ 
    a:null, 
    ar:new Array(), 

Vì vậy, cả hai đối tượng chia sẻ cùng một mảng vì thứ e constructor đối tượng chỉ sao chép tham chiếu đến mảng không phải là đối tượng mảng đầy đủ.

Không chắc thế nào Ext.js xử lý nhà xây dựng/initializers nhưng bạn cần phải tạo ra các mảng trong quá trình thi đối tượng không phải khi bạn khai báo nó ....

OK, Googling đã cho tôi điều này:

Ext.define('baseClass',{ 
    constructor: function() { 
     this.ar = []; 
    }, 

Điều đó sẽ giải quyết vấn đề của bạn.

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