2013-01-09 39 views
5

Tôi đang tìm cách ghi đè thuộc tính .length của đối tượng trong JavaScript.Cách ghi đè hàm.length để trả về độ dài của mảng, ở chế độ nghiêm ngặt

Tôi hiện đang có một wrapper trên mảng parent.properties.objects

(mẹ được sử dụng để cho mã để có thể đọc nhiều hơn trong bối cảnh)

Đây là cấu trúc cơ bản:

(biến cha mẹ được định nghĩa trong namespace và intialized)

var parent = function() { 
    this.properties = { 
    objects: []; 
    }; 
}; 

wrapper

(function() { 
    "use strict"; 

    objects = function() { 

Nếu không có đối số được truyền, giả sử có được

if (arguments.length === 0) { 
    var _objects = parent.properties.objects; 
    return _objects; 

sửa đổi hoặc các đối tượng bộ lọc

} else if (arguments.length > 0) { 
     ... 
    } 
    }; 

điều này tạo ra một Object.prototype (không [mẫu]) thay đổi và bổ sung thêm độ dài phương pháp ()

objects.prototype.length = function() { 
    var length = parent.properties.objects.length; 
    return length; 
    } 

Lỗi

objects.prototype.__proto__.length = function() {  
    var length = parent.properties.objects.length; 
    return length; 
    } 

    parent.objects = objects; 
})(); 
+0

Bạn có thể cụ thể hơn về loại lỗi bạn đang nhận được không? – guypursey

+0

Tôi đã tấn công nó với các đối tượng.Length() (JavaScript có phân biệt chữ hoa chữ thường). Tôi đang thực hiện việc này để viết một API thoải mái và không có chức năng cho mọi hoạt động có/thiết lập thuộc tính. nhưng một hàm duy nhất cho mọi thuộc tính. Nó sẽ được tốt đẹp để gọi objects.length(), nhưng objects.Length() sẽ làm, trái ngược với các đối tượng(). Length(). Lỗi là một số loại __proto__ không tìm thấy blah blah blah. Sẽ phải chờ ECMA 6. –

+0

Dòng cuối cùng của bạn 'parent.object = object;' phải làm gì? 'parent' là một hàm, và tôi không thấy biến' object' được khai báo ở bất cứ đâu – Bergi

Trả lời

3

Giả sử tôi đã hiểu câu hỏi của bạn một cách chính xác, mã sau đây có thể giúp bạn:

function MyObject() { 
    this.myActualData = []; 
} 

Object.defineProperty(MyObject.prototype, 'length', {get: function() { 
    return this.myActualData.length; 
}}); 

Và đây là một ví dụ về nó trong sử dụng:

var x = new MyObject(); 
x.myActualData.push("Hello"); 
x.myActualData.push("World"); 
x.length; // is 2 

Lưu ý: đây công việc sẽ chỉ trên trình duyệt ecmascript 5 trở lên.

+0

Tôi có thể làm cho nó hoạt động như thế nào trên tên của đối tượng không xác định (MyObject), như thể đối tượng và tên của nó đang được tạo trong khi tải trang ..? –

+0

Tôi không chắc chắn nếu tôi hoàn toàn hiểu câu hỏi của bạn, nhưng bạn có thể thực hiện cuộc gọi Object.defineProperty trên bất kỳ đối tượng nào, không chỉ là một mẫu thử nghiệm. – kybernetikos

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