Por acaso, estou aprendendo o protótipo de You Don't Know JS: this & Object Prototypes , que é um livro maravilhoso para entender o design abaixo e esclarecer muitos equívocos (é por isso que estou tentando evitar o uso de herança e coisas assim instanceof
).
Mas eu tenho a mesma pergunta que as pessoas fizeram aqui. Várias respostas são realmente úteis e esclarecedoras. Eu também adoraria compartilhar meus entendimentos.
O que é um protótipo?
Objetos em JavaScript têm uma propriedade interna, indicada na especificação como [[Prototype]]
, que é simplesmente uma referência a outro objeto. Quase todos os objetos recebem um não-null
valor para essa propriedade, no momento de sua criação.
Como obter o protótipo de um objeto?
via __proto__
ouObject.getPrototypeOf
var a = { name: "wendi" };
a.__proto__ === Object.prototype // true
Object.getPrototypeOf(a) === Object.prototype // true
function Foo() {};
var b = new Foo();
b.__proto__ === Foo.prototype
b.__proto__.__proto__ === Object.prototype
Qual é o prototype
?
prototype
é um objeto criado automaticamente como uma propriedade especial de uma função , usada para estabelecer a cadeia de delegação (herança), também conhecida como cadeia de protótipo.
Quando criamos uma função a
, prototype
é automaticamente criado como uma propriedade especial sobre a
e salva o código de função em que o constructor
on prototype
.
function Foo() {};
Foo.prototype // Object {constructor: function}
Foo.prototype.constructor === Foo // true
Eu adoraria considerar essa propriedade como o local para armazenar as propriedades (incluindo métodos) de um objeto de função. Essa também é a razão pela qual funções utilitárias em JS são definidas como Array.prototype.forEach()
,Function.prototype.bind()
,Object.prototype.toString().
Por que enfatizar a propriedade de uma função ?
{}.prototype // undefined;
(function(){}).prototype // Object {constructor: function}
// The example above shows object does not have the prototype property.
// But we have Object.prototype, which implies an interesting fact that
typeof Object === "function"
var obj = new Object();
Assim, Arary
, Function
, Object
estão todas as funções. Devo admitir que isso atualiza minha impressão em JS. Eu sei que funções são cidadãos de primeira classe em JS, mas parece que ele é construído sobre funções.
Qual é a diferença entre __proto__
e prototype
?
__proto__
uma referência funciona em cada objeto para se referir à sua [[Prototype]]
propriedade.
prototype
é um objeto criado automaticamente como uma propriedade especial de uma função , usada para armazenar as propriedades (incluindo métodos) de um objeto de função.
Com esses dois, podemos mapear mentalmente a cadeia de protótipos. Como esta figura ilustra:
function Foo() {}
var b = new Foo();
b.__proto__ === Foo.prototype // true
Foo.__proto__ === Function.prototype // true
Function.prototype.__proto__ === Object.prototype // true
__proto__
diferenteconstructor.prototype
?