Object.prototype

Object.prototype - це властивість конструктора Object. Також, це остання ланка ланцюжка прототипів.

Атрибути поля Object.prototype
Доступний для запису ні
Доступний для переліку ні
Доступний для налаштування ні

Опис

Майже всі об'єкти JavaScript є екземплярами Object; типовий об'єкт успадковує властивості (в тому числі методи) від Object.prototype, хоча ці властивості можуть бути затінені (тобто, заміщені). Однак, можна навмисно створити Object, для якого це буде не так (наприклад, через Object.create(null)), або змінити його за допомогою Object.setPrototypeOf.

Зміни в прототипі Object видимі усім об'єктам через ланцюжок прототипів, якщо властивості й методи, яких стосуються ці зміни, не перевизначаються далі по ланцюжку прототипів. Це забезпечує дуже потужний, хоча й потенційно небезпечний, механізм для перевизначення або розширення поведінки об'єкта.

Властивості

Object.prototype.constructor
Вказує функцію, яка створила прототип об'єкта.
Object.prototype.__proto__
Вказує на об'єкт, що був використаний як прототип, коли створювався екземпляр об'єкта.
Object.prototype.__noSuchMethod__
Дозволяє визначити функцію, яка буде виконуватись, коли на об'єкті викликатиметься неіснуючий метод.
Object.prototype.__count__
Повертала кількість перелічуваних властивостей безпосередньо на визначеному користувачем об'єкті, але була прибрана.
Object.prototype.__parent__
Вказувала на контекст об'єкта, але була прибрана.

Методи

Object.prototype.__defineGetter__()
Прив'язує функцію до властивості, яка, під час звернення до неї, викликатиме цю функцію та повертатиме значення, яке повернула функція.
Object.prototype.__defineSetter__()
Прив'язує функцію до властивості, яка, під час присвоєння, виконує цю функцію, яка змінює властивість.
Object.prototype.__lookupGetter__()
Повертає функцію, прив'язану до вказаної властивості методом __defineGetter__().
Object.prototype.__lookupSetter__()
Повертає функцію, прив'язану до вказаної властивості методом __defineSetter__().
Object.prototype.hasOwnProperty()
Повертає булеве значення, що вказує, чи об'єкт містить вказану властивість як особисту властивість цього об'єкта, а не успадковану через ланцюжок прототипів.
Object.prototype.isPrototypeOf()
Повертає булеве значення, що вказує, чи присутній об'єкт, на якому викликається цей метод, у ланцюжку прототипів вказаного об'єкта.
Object.prototype.propertyIsEnumerable()
Повертає булеве значення, що вказує, чи встановлений внутрішній атрибут ECMAScript [[Enumerable]].
Object.prototype.toSource()
Повертає рядок, який містить першокод об'єктного літералу, що відображає об'єкт, на якому був викликаний цей метод; ви можете скористатись цим значенням, щоб створити новий об'єкт.
Object.prototype.toLocaleString()
Викликає toString().
Object.prototype.toString()
Повертає рядок, що відображає об'єкт.
Object.prototype.unwatch()
Прибирає точку спостереження з властивості об'єкта.
Object.prototype.valueOf()
Повертає просту величину вказаного об'єкта.
Object.prototype.watch()
Додає точку спостереження до властивості об'єкта.
Object.prototype.eval()
Обчислював рядок коду JavaScript у контексті вказаного об'єкта, але був прибраний.

Приклади

Змінюючи поведінку існуючих методів Object.prototype, розгляньте включення коду додаванням вашого розширення до чи після існуючої логіки. Наприклад, цей (неперевірений) код буде попередньо виконувати власну логіку перед тим, як буде виконано вбудовану логіку або інше розширення.

Коли викликається функція, аргументи виклику містяться у подібній до масиву "змінній" arguments. Наприклад, у виклику "myFn(a, b, c)", arguments, що знаходиться у тілі myFn, міститиме 3 подібні до масиву елементи, що відповідають (a, b, c). Модифікуючи прототипи з хуками, просто передайте this та arguments (стан виклику) до поточної поведінки, викликавши apply() на функції. Цей шаблон може використовуватись до будь-яких прототипів, таких як Node.prototype, Function.prototype, і т. д.

var current = Object.prototype.valueOf;

// Оскільки моя властивість "-prop-value" є наскрізною та не завжди
// знаходиться в тому самому ланцюжку прототипів, я хочу змінити Object.prototype:
Object.prototype.valueOf = function() {
  if (this.hasOwnProperty('-prop-value')) {
    return this['-prop-value'];
  } else {
    // Це не схоже на один з моїх об'єктів, тому повернемось 
    // до початкової поведінки, відтворивши поточну поведінку якнайкраще.
    // Метод apply поводиться як "super" у деяких інших мовах.
    // І хоча valueOf() не приймає аргументів, можливо, інший хук їх прийматиме.
    return current.apply(this, arguments);
  }
}

Оскільки JavaScript не має об'єктів підкласу, прототип є зручним обхідним рішенням для створення об'єкта у ролі "базового класу" з певними функціями, що діють як об'єкти. Наприклад:

var Person = function(name) {
  this.name = name;
  this.canTalk = true;
};

Person.prototype.greet = function() {
  if (this.canTalk) {
    console.log('Привіт, я ' + this.name);
  }
};

var Employee = function(name, title) {
  Person.call(this, name);
  this.title = title;
};

Employee.prototype = Object.create(Person.prototype);

Employee.prototype.greet = function() {
  if (this.canTalk) {
    console.log('Привіт, я ' + this.name + ', ' + this.title);
  }
};

var Customer = function(name) {
  Person.call(this, name);
};

Customer.prototype = Object.create(Person.prototype);

var Mime = function(name) {
  Person.call(this, name);
  this.canTalk = false;
};

Mime.prototype = Object.create(Person.prototype);

var bob = new Employee('Боб', 'будівельник');
var joe = new Customer('Джо');
var rg = new Employee('Ред Грін', 'майстер на всі руки');
var mike = new Customer('Майк');
var mime = new Mime('Мім');

bob.greet();
// Привіт, я Боб, будівельник

joe.greet();
// Привіт, я Джо

rg.greet();
// Привіт, я Ред Грін, майстер на всі руки

mike.greet();
// Привіт, я Майк

mime.greet();

Специфікації

Специфікація Статус Коментар
ECMAScript Latest Draft (ECMA-262)
The definition of 'Object.prototype' in that specification.
Draft
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'Object.prototype' in that specification.
Standard
ECMAScript 5.1 (ECMA-262)
The definition of 'Object.prototype' in that specification.
Standard
ECMAScript 1st Edition (ECMA-262) Standard Початкове визначення. Реалізоване у JavaScript 1.0.

Сумісність з веб-переглядачами

Update compatibility data on GitHub
DesktopMobileServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome for AndroidFirefox for AndroidOpera for AndroidSafari on iOSSamsung InternetNode.js
prototypeChrome Full support 1Edge Full support 12Firefox Full support 1IE Full support 3Opera Full support YesSafari Full support YesWebView Android Full support 1Chrome Android Full support 18Firefox Android Full support 4Opera Android Full support YesSafari iOS Full support YesSamsung Internet Android Full support 1.0nodejs Full support Yes

Legend

Full support  
Full support

Див. також