Główną różnicą jest w taki sposób, w jaki jest używany i związane z nim niebezpieczeństwa.
Pierwsza z nich zmusza do użycia new
, gdy chcesz utworzyć nowy obiekt. Składnia jest dość brzydka (SomeConstructor.prototype.method
) i ma jedną poważną wadę: wywołanie konstruktora, który dodaje właściwości (this.name = nameParam
...) bez new
zastosuje konstrukcję do obiektu globalnego. Zachowanie konstruktora jest dziwne (utwórz nowy obiekt, który deleguje do SomeConstructor.prototype
, następnie zastosuj konstruktor do nowego obiektu, a następnie, jeśli konstruktor zwróci coś, zastąp obiekt czymś). Dodatkowo, w twoim przykładzie, foo
sam nie jest użyteczny, musisz utworzyć nowy obiekt, aby uzyskać dostęp do jego funkcjonalności.
Drugi, Object.create
, nie wymusza na użytkowniku żadnych syntetycznych dziwactw. Nie masz globalnego ryzyka zanieczyszczenia. Obiekt foo
ma funkcjonalności, które mogą być już używane bez tworzenia nowego obiektu, a bar
pożyczy te funkcje. Tego rodzaju wzorzec może również ułatwić wdrażanie fabryk (bez możliwości zastąpienia ich wszędzie) i pul obiektów w razie potrzeby.
Eric Eliott talks about it very well i Kyle Simpson wrote a whole book o delegacji prototypowej!
A oto jak odnośnika dzieje:
- W konstruktorze odnośnika odbywa się na
Constructor.prototype
(nie rzeczywisty wewnętrzny prototypu konstruktora, ale jego prototype
nieruchomość Jeśli okaże się to kłopotliwe. , gratulacje, jesteś człowiekiem). Dodatkowe właściwości ustawia się w funkcji konstruktora. foo
sam nie jest używany do wyszukiwania, foo.prototype
(ponownie, nie taki sam, jak foo.__proto__
, który wskazuje na funkcję) jest używany do tego.
- Z
Object.create
wyszukiwanie odbywa się na samym obiekcie (foo
). Na obiekcie nie ma nieprototypowej właściwości.
Istnieje very funny diagrams on this page of Kyle Simpson's book, które wyjaśniają to dalej.
Więcej na new
w tej kwestii: Is JavaScript's "new" keyword considered harmful?
Jedną z różnic jest to, że 'Object.create' jest nowszy, i nie jest obsługiwana w IE8 i poniżej – keune
nie widzę prototypal dziedziczenie ** ** w swoich przykładach. – hindmost
@ czy najdokładniej możesz to rozwinąć? – shmuli