2011-09-05 37 views
35

Trong đoạn mã sau, tôi muốn có một bộ đếm để theo dõi số lượng đối tượng Person được tạo ra. Mã này không làm như vậy, làm thế nào tôi sẽ thực hiện được điều đó?Làm thế nào để khai báo một biến tĩnh trong Javascript

function Person(){ 
    this.name = "Peter"; 
    this.counter = this.counter + 1; 
    alert(this.counter); 
} 

Person.prototype.counter = 0; 

var p1 = new Person; 
var p2 = new Person; 
+1

Ai đó có thể giải thích cách thực sự hoạt động. – nepsdotin

Trả lời

72
function Person(){ 
    this.name = "Peter"; 
    Person.counter++; 
    alert(Person.counter); 
} 

Person.counter = 0; 

var p1 = new Person(); 
var p2 = new Person(); 

Tận dụng "tĩnh" biến một tài sản của Person chức năng, chứ không phải là prototype, và sử dụng Person thay vì this bên trong constructor.

Điều này là có thể vì hàm JavaScript là lớp đầu tiên (nghĩa là chúng là đối tượng), do đó có thể có các thuộc tính của riêng chúng.

Dưới đây là working example của mã ở trên.

+2

Câu trả lời thứ 3, nhưng câu trả lời đầy đủ/chính xác nhất. –

+0

Nếu tôi có truy cập bên trong 'Person', thì làm thế nào tôi có thể lấy nó từ ý định của nó, như' p1? ' – Dims

+0

@Dims bạn có thể lấy nó từ một tham chiếu đến hàm tạo: 'p1.constructor.counter' –

5

Không có thuộc tính tĩnh. Nếu bạn muốn, bạn có thể lưu trữ dữ liệu trên chức năng Person.

function Person(){ 
    this.name = "Peter"; 
    Person.counter++; 
    alert(Person.counter); 
} 
2

Để tĩnh, bạn có thể chỉ định thuộc tính cho chính đối tượng hàm;

Person.counter = 0; 

Và bên trong hàm tạo tăng;

Person.counter += 1; 

Bạn cũng có thể check-nếu-không xác định và tạo Person.counter trong constructor

function Person(){ 
    if (typeof Person.counter === 'undefined') 
     Person.counter = 0; 
    else 
     Person.counter += 1; 
    ... 
0

Không có những điều như vậy như biến lớp tĩnh/tài sản trong js. Cách tiếp cận đơn giản nhất là sử dụng hàm "class" làm không gian tên cho các biến tĩnh.

Có nghĩa là, chỉ cần truy cập trực tiếp vào Person.count.

Bạn cũng có thể sử dụng các bao đóng, nhưng thực tế trong 90% trường hợp, nó sẽ quá mức cần thiết. Trong các trình duyệt hiện đại, bạn cũng có thể xác định lại hàm getter/setter để bao bọc việc sử dụng Person.count và các biến "tĩnh" khác.

đoạn này thể hiện ý tưởng:

function borrow(obj, borrowobj, fname) { 
    obj.__defineGetter__(fname, function() { 
     return borrowobj[fname] 
    }) 

    obj.__defineSetter__(fname, function(val) { 
      borrowobj[fname] = val  
    }) 
} 

function Person() { 
    borrow(this, Person, "count"); 
    this.count++ 
} 

Person.count = 0; 

new Person(); 
new Person(); 
var p = new Person(); 
alert(p.count); 
12

Bạn cũng có thể làm biến truy cập của bạn "tư nhân", tuyên bố nó như là địa phương để đóng cửa. Đó là cách tốt nhất để có điều gì đó tương tự với biến số riêng tư - tĩnh:

var Person = (function() { 

    var counter = 0; 

    return function() { 
     counter++; 
     this.name = "Peter"; 
     alert(counter); 
    } 
})(); 


var p1 = new Person(); 
var p2 = new Person(); 
Các vấn đề liên quan