2012-01-25 27 views
7

Thỉnh thoảng có một JS framework hoặc thư viện nghĩ rằng đó là một ý tưởng thực sự khôn ngoan để thêm một số tính năng mới thuần vào nguyên mẫu của Object hoặc Array. Tôi không thể tìm thấy thêm bất kỳ ví dụ nào ngay bây giờ, nhưng tôi nhớ rằng tôi đã có vấn đề với điều đó trước đây. Tất nhiên, làm như vậy phá vỡ vòng lặp cũ tốt for(...in...), bởi vì đột nhiên những thuộc tính này bây giờ cũng được liệt kê. Để có được xung quanh nó, bạn phải kiểm tra tất cả các tài sản liệt kê với .hasOwnProperty() trước khi truy cập. Đó là cồng kềnh, khi cố gắng viết mã mạnh mẽ.Bạn có thể tạo một đối tượng trong Javascript không được kế thừa từ Object không?

Vì vậy, tôi đã tự hỏi - có cách nào mà tôi có thể làm cho các đối tượng của riêng tôi như vậy, rằng họ không kế thừa từ Object? Ban đầu chơi xung quanh với .prototype không mang lại kết quả nào. Có lẽ có một số lừa cho nó? Hay mọi thứ sẽ luôn được thừa kế từ Object và tôi không thể làm gì với nó?

Đã thêm: Tôi đoán tôi nên lưu ý rằng tôi muốn nó cho các tập lệnh máy khách trong trình duyệt và khả năng tương thích phải bao gồm IE6 hoặc ít nhất IE7. Các yêu cầu phiên bản trình duyệt khác là khoan dung hơn, mặc dù càng tốt, tất nhiên. (Vâng, thật đáng buồn, thế giới doanh nghiệp vẫn sống trong IE cấp thế giới ...)

+0

* bad * cũ 'for (... in ...)' loop chắc chắn –

+1

@RobAgar - tại sao vậy? Thực sự, tôi cảm thấy mệt mỏi khi viết những thứ như 'for (var i, l = myArray.length; i

+0

thường là các khuôn khổ thay đổi nguyên mẫu, cũng cung cấp cách lặp qua các phần tử. Trong Mootools, 'myObj.each()' sẽ làm công việc .. cũng '[" foo "," bar "]. Each()' – pleasedontbelong

Trả lời

4

Trong ECMAScript 5 bạn có thể vượt qua null để Object.create:

> obj = Object.create(null); 
    Object 
    No Properties 
+0

Thật tuyệt vời! Tuyệt vời! Nó thực sự hoạt động! Ngoại trừ khả năng tương thích của trình duyệt là ảm đạm. :(Tôi đoán tôi nên nói rằng tôi cần nó cho IE6, hoặc ít nhất là IE7 –

+0

Tôi nghĩ rằng trong trường hợp đó bạn đang ở ngoài may mắn và sử dụng '.hasOwnProperty' là cơ hội duy nhất của bạn –

1

Bạn có thể loại bỏ một cách rõ ràng bất kỳ thuộc tính đối tượng đó là đếm được, nhưng trình duyệt kiểm duyệt cho phép các phương thức đối tượng không thể đếm được.

Nên hoạt động trong các trình duyệt cũ hơn.

function Myobject(props){ 
} 
var O=Object,OP=Object.prototype; 
for(var p in O)delete Myobject[p]; 
for(var p in OP)delete Myobject.prototype[p]; 
+0

Ý tưởng thú vị, sẽ thử. cũng - nếu chúng không phải là số đếm, thì nó đã ổn rồi, tôi chỉ quan tâm đến những người có thể đếm được ngay từ đầu. –

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