2016-08-25 17 views
5

W https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/fillnie mam pojęcia przedmiot (ten) oznacza

istnieje linia jak

// Steps 1-2. 
if (this == null) { 
    throw new TypeError('this is null or not defined'); 
} 

var O = Object(this);   // <- WHAT IS THIS??????????? 

// Steps 3-5. 
var len = O.length >>> 0; 

// Steps 6-7. 
var start = arguments[1]; 
var relativeStart = start >> 0; 

// Step 8. 
var k = relativeStart < 0 ? 
    Math.max(len + relativeStart, 0) : 
    Math.min(relativeStart, len); 

// Steps 9-10. 
var end = arguments[2]; 
var relativeEnd = end === undefined ? 
    len : end >> 0; 

// Step 11. 
var final = relativeEnd < 0 ? 
    Math.max(len + relativeEnd, 0) : 
    Math.min(relativeEnd, len); 

// Step 12. 
while (k < final) { 
    O[k] = value; 
    k++; 
} 

// Step 13. 
return O; 

i nie mogę znaleźć żadnego konieczność przypisania O jako przedmiot (ten).

Czy jest napisane tylko dla czytelności, czy jest jakiś konkretny powód przydziału?

+1

Cóż, postępuje zgodnie z instrukcjami algorytmu podanymi w specyfikacji. I tam mówi: "Niech się stanie? ToObject (ta wartość). "Http://www.ecma-international.org/ecma-262/7.0/#sec-array.prototype.fill –

Odpowiedz

3

Jak zasugerowano w komentarzach do kodu, w tej sekcji należy dokładnie pollyfill pierwsze kroki udokumentowane w the spec.

  1. Niech O będzie ToObject (ta wartość).
  2. ReturnIfAbrupt (O).

Choć nieco out-of-order, to jest wykonanie fucntion z ToObject(this value):

var O = Object(this); 

Zasadniczo, jeśli to się nazywa na brak obiektu, niż obiekt powinien być rzutować na Object.

Na przykład, gdybyśmy uruchomili ten fragment przeważnie bezsensownego kodu w silniku JavaScript, który natywnie obsługuje tę metodę, zobaczymy instancję obiektu Number.

Array.prototype.fill.call(123); 

Ta linia zapewni taki sam efekt od polyfill.

+0

Mam to! Używam trybu ścisłego, więc wątpię w jego cel. Wielkie dzięki! –

1

Konstruktor obiektów zwraca argument, gdy argument jest już obiektem. Jeśli nie jest obiektem, zwraca "zobiektywizowaną" wersję argumentu: instancję String, jeśli jest ciągiem znaków, instancję Number, jeśli jest to numer itd.

Funkcja, o której mowa, jest trochę dziwna, aw w szczególności wartość this będzie zwykle być i tak obiektem. Nie ma ona być, ale musisz - zejść ci z drogi, aby dostać się do wnętrza polyfill z wartością, która nie jest przedmiotem.

+1

Może warto zauważyć, że' this' jest zawsze obiektem w trybie nie-ścisłym , ale może być prymitywny w trybie ścisłym. –

+0

@FelixKing tak dobry punkt. Próbuję dowiedzieć się, co ten kod próbuje zrobić; w szczególności nie widzę sensu tych przesunięć w prawo o 0. Nic nie sprawdza, czy '.length' istnieje, więc jeśli funkcja zostanie zastosowana do niewłaściwego typu obiektu, to zawodzi w dość niezręczny sposób. Ale tak, co sugerujesz, jest prawdą. – Pointy

+0

Myślę, że to po prostu stara się być bardzo blisko specyfikacji. –

Powiązane problemy