2013-05-20 9 views
6

Na przykład Array typ danych ma funkcję o nazwie pop(), co przypuszczam jest dodawany za pomocą:Dlaczego natywne właściwości typów danych nie są wyświetlane w ich odpowiednich prototypach?

Array.prototype.pop = function(){ /* ... */ }; 

Ale o ile wiem, to jedyny sposób, aby nie przeliczalny jest zrobić coś takiego to:

Object.defineProperty(Array.prototype, "pop", { enumerable: false }); 

Który nie jest obsługiwany przez wszystkie przeglądarki.

Array.prototype.doSomething= function(){ }; 
var arr = []; 

console.log(arr); // [doSomething: function] 

Więc dlaczego doSomething pokazać się tutaj, natomiast pop() nie? Czy oboje nie zostali dodani do prototypu?

+0

Tablice są rejestrowane przy użyciu literałów tablicowych: '[elem, elem]'. Jak byś się tu zmieściły właściwości niestandardowe? '{0: elem, 1: elem, length: 2, pop: ...}'? –

+0

@ alex23 W tym przykładzie narzędzia dla programistów chrome. Ale zwykle firebug. Wydaje mi się, że również tam się pojawia. – Johan

+0

@RobW Cóż, jeśli spojrzeć tutaj: http: // jsfiddle.net/6BAJx/1/w Chrome otrzymasz '[1, 2, 3, doSomething: function]'. Moje pytanie brzmiało: dlaczego moje własne właściwości "pasują", gdy są natywne, są niewidoczne. – Johan

Odpowiedz

4

MDN mówi:

A dla ... w pętli nie iteracyjne nad właściwości non-przeliczalna. Obiekty utworzone za pomocą wbudowanych konstruktorów, takich jak Array i Object, odziedziczyły nieprzeliczalne właściwości z Object.prototype i String.prototype, które nie są przeliczalne, takie jak metoda IndexOf String lub metoda ToString obiektu. Pętla będzie iterować nad wszystkimi przeliczalnymi właściwościami samego obiektu i obiektów dziedziczonych po prototypie jego konstruktora (właściwości bliższe obiektowi w prototypowych właściwościach prototypów łańcucha prototypów).

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/for...in

Co jest rejestrowane jest rzekomo pochodzące z for..in.. iteracji, lub podobnym.

Pojęcie nierekwalifikowalnych właściwości poprzedza funkcję bycia, aby wyszczególnić właściwość wyliczalności bezpośrednio w JavaScript.

MDN mówi:

ECMAScript 3 posiada wewnętrzny atrybut o nazwie DontEnum. Ten atrybut jest domyślnie dołączony do niektórych właściwości (§8.6.1).

Wewnętrzny atrybut DontEnum określa, co nie ma być wyliczane na podstawie wyliczenia typu wejściowego (§12.6.4). propertyIsEnumerable testu

https://developer.mozilla.org/en/docs/ECMAScript_DontEnum_attribute

ECMAScript 3 Spec określa wiele właściwości o atrybut DontEnum. http://bclary.com/2004/11/07/

To rzeczywiście nie rozwiązuje całą zagadkę, bo na przykład Array.prototype.pop nie jest wyraźnie wymienione jako posiadające atrybut DontEnum, tylko sama Array.prototype znajduje się na liście tak. Możliwe, że atrybut natywnej funkcji jest domyślny, ale nie mogę znaleźć dla niego odwołania. Pierwszy cytat z MDN na przykład opisuje String.prototype.indexOf jako nieprzeliczalny, podczas gdy nie jest to wyraźnie wspomniane w specyfikacji EcmaScript 3.

Powiązane problemy