2014-06-13 11 views
5

Cóż, cały czas sądziłem, że właściwość prototypu istnieje we wszystkich obiektach. Ale po jednym z rozmów kwalifikacyjnych wróciłem do domu i otworzyłem konsolę chromowanąGdzie zdefiniowano właściwość `prototype`

window.prototype 
**undefined** 

WTF?

Object.prototype 
**Object {}** 

OK

var a = {}; 
a.prototype 
**undefined** 

var a = function(){} 
a.prototype 
**Object {}** 

Czytałem https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/prototype kilka razy, ale nadal nie jest jasne. Czy ktoś może wyjaśnić?

Thanx

P.S. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/prototype

Wszystkie obiekty w JavaScript pochodzą od Object; Wszystkie obiekty dziedziczą metod i właściwości z Object.prototype, chociaż mogą być przesłonić (z wyjątkiem obiekt o zerowym prototypu, tj Object.create (null)

okno jest Object, więc musi mieć prototyp nieruchomość

Odpowiedz

7

przedmiotem instancja dziedziczy, jego prototyp, jest przechowywana we właściwości wewnętrznego, [[Prototype]]. jego wartość może być pobrana z Object.getPrototypeOf() (w silnikach ES5 kompatybilnych).

console.log(Object.getPrototypeOf(window)); 
// Window { ... } 

var a = {}; 
console.log(Object.getPrototypeOf(a)); 
// Object { ... } 

Tylko function s wyraźnie mają prototype property:

console.log(typeof Object); 
// 'function' 

A wartość prototype jest właśnie używany do ustawiania wartości instancja na [[Prototype]] gdy instancja new jest tworzony.

function Foo() {} 
var bar = new Foo(); 

console.log(Foo.prototype === Object.getPrototypeOf(bar)); // true 
+1

a co z dostępem przez zapisywanie .prototype? Myślę, że Object.getPrototypeOf return ._proto_ property nie jest? –

+1

@VasilVanchuk, myObject .__ proto__ robi to samo, co Object.getPrototypeOf (myObject) w starszych przeglądarkach, ale jest przestarzałe. Zobacz https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/proto –

+1

@VasilVanchuk 1) 'Funkcja ma tylko właściwość' prototype', więc instancje dziedziczą ją z obiektu zamiast samego konstruktora. Ale każdy obiekt może być użyty jako prototyp innego ([Object.create() '] (http://ecma-international.org/ecma-262/5.1/#sec-15.2.3.5)), więc własność 'prototype' nie jest w inny sposób niezbędna i na ogół nie zostanie znaleziona. 2) I tak, 'getPrototypeOf()' i '__proto__' będą miały tę samą wartość. Ale "__proto__" jest niestandardowe i zostało wycofane w niektórych przeglądarkach obsługujących. –

Powiązane problemy