--- title: Object.prototype slug: conflicting/Web/JavaScript/Reference/Global_Objects/Object tags: - JavaScript - Objeto - Propriedade translation_of: Web/JavaScript/Reference/Global_Objects/Object translation_of_original: Web/JavaScript/Reference/Global_Objects/Object/prototype original_slug: Web/JavaScript/Reference/Global_Objects/Object/prototype ---
A propriedade Object.prototype
representa o {{jsxref("Global_Objects/Object", "Object")}} protótipo do objeto.
{{js_property_attributes(0, 0, 0)}}
Praticamente todos os objetos em JavaScript descendem de {{jsxref("Global_Objects/Object", "Object")}}; todos os métodos e propriedades herdados de Object.prototype
, embora possam ser sobrescritos (exceto um Objeto
com protótipo nulo, i.e. Object.create(null)
). Por exemplo, outros protótipos construtores sobrescrevem a propriedade construtora e fornece seus próprios {{jsxref("Object.prototype.toString()", "toString()")}} métodos.
Modificações no Objeto protótipo
do objeto são propagadas a todos objetos através do encadeamento de protótipos, a menos que as propriedades e métodos submetidos às mudanças sejam sobrescritos mais além no encadeamento dos protótipos. Este recurso oferece um mecânismo muito poderoso apesar de perigoso para sobrescrita e extensão de objetos.
Quando é alterado o comportamento de um método de um Objeto protótipo, considere injetar código envolvendo sua extensão antes ou depois ta lógica existente. Por exemplo, este (não testado) código irá pré-condicionalmente executar uma lógica personalizada antes da lógica embutida ou a extensão de alguém será executada.
Quando uma função é chamada os argumentos para a chamada são segurados no array de argumentos como "variável". Por exemplo, na chamada "minhaFuncao(a, b, c)", os argumentos no corpo da minhaFuncao irão conter 3 elementos array correspondentes a (a, b, c). Quando modificamos os protótipos com ganchos, simplesmente passamos this & a variável arguments (o estado de chamada) para o comportamento atual pela chamada apply() na função. Este padrão pode ser usado por qualquer protótipo, tal como Node.prototype, Function.prototype, etc.
var current = Object.prototype.valueOf;
// Desde que minha propriedade "-prop-value" é transversal e não está
// sempre na mesma cadeia de protótipo, desejo modificar Object.prototype:
Object.prototype.valueOf = function() {
if (this.hasOwnProperty("-prop-value") {
return this["-prop-value"];
} else {
// Isto não parece com um de meus objetos, então vamos retroceder ao
// comportamento padrão para reproduzir o comportamento atual o que
// pudermos. O apply se comporta como o"super" em outras linguagens.
// Mesmo que valueOf() não receba argumentos, alguns outros ganchos podem.
return current.apply(this, arguments);
}
}
Desde que JavaScript não tem exatamente objetos de subclasse, protótipo é uma forma usual de trabalhar para fazer um objeto "classe base" de certas funções que agem como objetos. Por exemplo:
var Person = function() { this.canTalk = true; this.greet = function() { if (this.canTalk) { console.log('Hi, I\'m ' + this.name); } }; }; var Employee = function(name, title) { this.name = name; this.title = title; this.greet = function() { if (this.canTalk) { console.log("Hi, I'm " + this.name + ", the " + this.title); } }; }; Employee.prototype = new Person(); var Customer = function(name) { this.name = name; }; Customer.prototype = new Person(); var Mime = function(name) { this.name = name; this.canTalk = false; }; Mime.prototype = new Person(); var bob = new Employee('Bob', 'Builder'); var joe = new Customer('Joe'); var rg = new Employee('Red Green', 'Handyman'); var mike = new Customer('Mike'); var mime = new Mime('Mime'); bob.greet(); joe.greet(); rg.greet(); mike.greet(); mime.greet();
O retorno será:
Hi, I'm Bob, the Builder Hi, I'm Joe Hi, I'm Red Green, the Handyman Hi, I'm Mike
Especificações | Situação | Comentário |
---|---|---|
ECMAScript 1st Edition. Implemented in JavaScript 1.0. | Padrão | Definição inicial. |
{{SpecName('ES5.1', '#sec-15.2.3.1', 'Object.prototype')}} | {{Spec2('ES5.1')}} | |
{{SpecName('ES6', '#sec-object.prototype', 'Object.prototype')}} | {{Spec2('ES6')}} |
Aspecto | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Suporte básico | {{CompatVersionUnknown}} | {{CompatVersionUnknown}} | {{CompatVersionUnknown}} | {{CompatVersionUnknown}} | {{CompatVersionUnknown}} |
Aspecto | Android | Chrome para Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Suporte básico. | {{CompatVersionUnknown}} | {{CompatVersionUnknown}} | {{CompatVersionUnknown}} | {{CompatVersionUnknown}} | {{CompatVersionUnknown}} | {{CompatVersionUnknown}} |