Как получить доступ к прототипу объекта в javascript?

Во всех статьях написано, что JavaScript — это язык, основанный на прототипах, то есть каждый объект имеет прототип (точнее, цепочку прототипов).

До сих пор я пробовал следующий фрагмент кода:

var F = function();
F.prototype.member1 = 1;
var object1 = new F();
console.log(object1.member1); // prints 1

Как я могу получить доступ к прототипу объекта object1? Есть ли независимый от браузера способ сделать это (я имею в виду, не полагаясь на свойство __proto__? objects-prototype-chain">эта ссылка, но, возможно, есть новые разработки с 2010 года) Если я не могу, не могли бы вы поделиться, пожалуйста, обоснованием капота?


person BreakPhreak    schedule 05.10.2011    source источник
comment
объект1.конструктор.прототип   -  person Silver Moon    schedule 06.01.2013


Ответы (4)


var f = function();
var instance = new f();

Если вы знаете имя instance функции класса, вы можете просто получить доступ к прототипу как:

var prototype = f.prototype;
prototype.someMember = someValue;

Если вы этого не сделаете:

1)

var prototype = Object.getPrototypeOf(instance);
prototype.someMember = someValue;

2) или

var prototype = instance.__proto__;
prototype.someMember = someValue;

3) или

var prototype = instance.constructor.prototype; // works only if constructor is properly assigned and not modified
prototype.someMember = someValue;

Для совместимости вы можете поместить в свой код следующий фрагмент (и всегда использовать Object.getPrototypeOf(instance) для возврата прототипа):

if(!Object.getPrototypeOf) {

  if(({}).__proto__ === Object.prototype && ([]).__proto__ === Array.prototype) {

    Object.getPrototypeOf = function getPrototypeOf(object) {
      return object.__proto__;
    };

  } else {

    Object.getPrototypeOf = function getPrototypeOf(object) {

      // May break if the constructor has been changed or removed
      return object.constructor ? object.constructor.prototype : void 0;

    };

  }
}

ОБНОВЛЕНИЕ:

Согласно 6-му изданию ECMA-262 (июнь 2015 г.) свойство __proto__ стандартизировано как дополнительная функция для веб-браузеров. Все последние версии популярных браузеров теперь поддерживают его. Подробнее о __proto__:

person Andrew D.    schedule 05.10.2011
comment
с одним комментарием: __proto__ не будет работать в каждом браузере - person BreakPhreak; 06.10.2011
comment
Не только __proto__, но и все вышеперечисленные три метода не будут работать во всех браузерах. Но код совместимости основан на всех этих методах. Кроме того, для пяти основных браузеров (IE,FF,Chrome,Safari,Opera) все последние версии браузеров поддерживают Object.getPrototypeOf(), а код совместимости требуется только для IE8 и старше. - person Andrew D.; 07.10.2011

Это выглядит как

Object.getPrototypeOf(passedObject);

будет работать для этого и совместим с современными браузерами.

Вот таблицы совместимости на MDN

person HelloWorld    schedule 14.08.2017

person    schedule
comment
Обратите внимание, что иногда это не работает. Например, a = Function.prototype; a.constructor.prototype будет равен a. Но очевидно прототип отличается. Вы можете подтвердить, что прототипом является Object.prototype, проверив a.__proto__, что является лучшим способом проверки прототипа. - person Piotr Dabkowski; 31.10.2014

person    schedule
comment
Кодовые ответы не приветствуются. Пожалуйста, добавьте некоторое объяснение того, как это решает проблему или чем это отличается от существующих ответов. Из обзора - person Nick; 11.05.2019