Как получить доступ к прототипу объекта в JavaScript? - PullRequest
56 голосов
/ 05 октября 2011

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

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

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

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

Ответы [ 5 ]

105 голосов
/ 05 октября 2011
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;

    };

  }
}

ОБНОВЛЕНИЕ:

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

5 голосов
/ 14 августа 2017

Похоже,

Object.getPrototypeOf(passedObject);

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

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

5 голосов
/ 05 октября 2011
var F = function(){};
var object1 = new F();
alert(object1.constructor === F);
alert(object1.constructor.prototype === F.prototype);
1 голос
/ 08 мая 2013
var F = function();
F.prototype.member1 = 1;
F.prototype.getClass = F;

var object1 = new F();
object1.member1 = 2;

console.log(object1.getClass.prototype.member1); // prints 1
console.log(object1.member1); // prints 2
0 голосов
/ 10 мая 2019
var F = function();
F.prototype.member1 = 1;
var intance = new F();
console.log(instance['member1']);
...