Thông thường, tôi đã nhìn thấy chức năng nguyên mẫu tuyên bố bên ngoài định nghĩa lớp, như thế này:Setting javascript chức năng nguyên mẫu trong khai báo lớp đối tượng
function Container(param) {
this.member = param;
}
Container.prototype.stamp = function (string) {
return this.member + string;
}
var container1 = new Container('A');
alert(container1.member);
alert(container1.stamp('X'));
Mã này tạo ra hai cảnh báo với các giá trị "A" và "AX" .
Tôi muốn xác định hàm nguyên mẫu INSIDE của định nghĩa lớp. Có điều gì sai trái khi làm việc như thế này không?
function Container(param) {
this.member = param;
if (!Container.prototype.stamp) {
Container.prototype.stamp = function() {
return this.member + string;
}
}
}
Tôi đã thử cách này để tôi có thể truy cập biến riêng tư trong lớp học. Nhưng tôi đã phát hiện ra rằng nếu hàm nguyên mẫu của tôi tham chiếu đến biến riêng tư, giá trị của biến riêng tư luôn là giá trị được sử dụng khi hàm nguyên mẫu được tạo ra, không phải giá trị trong đối tượng đối tượng:
Container = function(param) {
this.member = param;
var privateVar = param;
if (!Container.prototype.stamp) {
Container.prototype.stamp = function(string) {
return privateVar + this.member + string;
}
}
}
var container1 = new Container('A');
var container2 = new Container('B');
alert(container1.stamp('X'));
alert(container2.stamp('X'));
Mã này tạo ra hai cảnh báo với các giá trị "AAX" và "ABX". Tôi đã hy vọng đầu ra sẽ là "AAX" và "BBX". Tôi tò mò tại sao điều này không hoạt động, và nếu có một số mô hình khác mà tôi có thể sử dụng để thay thế.
EDIT: Lưu ý rằng tôi hoàn toàn hiểu rằng đối với ví dụ đơn giản này, tốt nhất là chỉ nên sử dụng một đóng như this.stamp = function() {}
và không sử dụng nguyên mẫu nào cả. Đó là cách tôi sẽ làm điều đó. Nhưng tôi đã thử nghiệm bằng cách sử dụng mẫu thử nghiệm để tìm hiểu thêm về nó và muốn biết một vài điều:
- Khi sử dụng chức năng nguyên mẫu thay vì đóng cửa là khi nào? Tôi chỉ cần sử dụng chúng để mở rộng các đối tượng hiện có, như
Date
. Tôi đã đọc rằng closures are faster. - Nếu tôi cần sử dụng hàm nguyên mẫu vì lý do nào đó, có phải là "OK" để xác định nó trong lớp, như trong ví dụ của tôi hay nó được định nghĩa bên ngoài?
- Tôi muốn hiểu tại sao giá trị privateVar của mỗi cá thể không thể truy cập được vào hàm mẫu, chỉ giá trị của cá thể đầu tiên.
đóng cửa striked một lần nữa ... – Dormilich
Đọc trên đóng cửa (http://www.jibbering.com/faq/faq_notes/closures.html) vì những lý do cụ thể tại sao mã của bạn cư xử theo cách nó. – outis