2013-01-09 16 views
5

Poszukuję sposobu nadpisania właściwości .length obiektu w JavaScript.Jak przesłonić Function.length, aby zwrócić długość tablicy, w trybie ścisłym

Obecnie posiadają owijki na parent.properties.objects tablicy

(nadrzędny jest używany do, na kod się bardziej czytelne w kontekście)

Jest to podstawową strukturę:

(zmienna macierzysty jest zdefiniowana w nazw i intialized)

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

owijka

(function() { 
    "use strict"; 

    objects = function() { 

Jeśli żaden argument nie jest przekazywana, zakładamy dostać

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

modyfikować lub filtr obiektów

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

to tworzy Object.prototype zmienna (nie [prototyp]) i dodaje długości metodą ()

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

błąd

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

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

Czy możesz dokładniej określić rodzaj błędu, który otrzymujesz? – guypursey

+0

Zhakowałem go za pomocą objects.Length() (JavaScript rozróżnia duże i małe litery). Robię to, aby napisać wygodny interfejs API, a nie mieć funkcji dla każdej operacji pobierania/ustawiania właściwości. ale jedna funkcja dla każdej własności. Byłoby miło wywołać objects.length(), ale zrobi to objects.Length(), w przeciwieństwie do objects(). Length(). Błąd był pewnego rodzaju __proto__ nie znaleziono bla bla bla. Będzie musiał poczekać na ECMA 6. –

+0

Jaki jest twój ostatni wiersz 'parent.object = object;' powinien zrobić? 'parent' jest funkcją i nie widzę zmiennej' object' zadeklarowanej gdziekolwiek, – Bergi

Odpowiedz

3

Zakładając mam rozumieć swoje pytanie poprawnie poniższy kod może pomóc:

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

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

A oto przykład z nim w użyciu:

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

Uwaga: to tylko praca w przeglądarkach ecmascript 5 i wyższych.

+0

w jaki sposób mogę sprawić, by działało na nazwę nieznanego obiektu (MyObject), na przykład, jeśli obiekt i jego nazwa są tworzone podczas ładowania strony ..? –

+0

Nie jestem pewien, czy całkowicie rozumiem twoje pytanie, ale możesz wykonać wywołanie Object.defineProperty na dowolnym obiekcie, a nie tylko prototypie. – kybernetikos

Powiązane problemy