Подтвердить что ты не робот

Как я могу увидеть цепочку прототипов объекта Javascript?

С учетом следующего кода:

function a() {}
function b() {}
b.prototype = new a();
var b1 = new b();

Мы можем остаться, что a был добавлен в цепочку прототипов b. Отлично. И все верно:

b1 instanceof b
b1 instanceof a
b1 instanceof Object

Мой вопрос: что, если мы заранее не знаем происхождение b1? Как мы можем обнаружить членов своей прототипной цепи? В идеале мне нужен массив вроде [b, a, Object] или ["b", "a", "Object"].

Возможно ли это? По-моему, я видел ответ где-то на SO, который описывал, как это узнать, но я не могу, чтобы жизнь меня снова находила.

4b9b3361

Ответ 1

Ну, прототип связи между объектами ([[Prototype]]) является внутренним, некоторые реализации, такие как Mozilla, отображают его как obj.__proto__.

Object.getPrototypeOf метод ECMAScript 5th Edition - это то, что вам нужно, но оно не реализовано прямо сейчас на большинстве JavaScript двигатели.

Посмотрите на эту реализацию Джона Ресига, у нее есть ловушка, она полагается на свойство constructor для движков, t __proto__:

if ( typeof Object.getPrototypeOf !== "function" ) {
  if ( typeof "test".__proto__ === "object" ) {
    Object.getPrototypeOf = function(object){
      return object.__proto__;
    };
  } else {
    Object.getPrototypeOf = function(object){
      // May break if the constructor has been tampered with
      return object.constructor.prototype;
    };
  }
}

Помните, что это не на 100% надежнее, так как свойство constructor изменено на любом объекте.

Ответ 2

Вы можете использовать свойство "конструктор" объекта, чтобы найти там прототип, а затем прокрутите его до тех пор, пока не достигнете конца радуги.

function getPrototypes(o) {
  return (function gp(o, protos) {
    var c = o.constructor;
    if (c.prototype) {
      protos.push(c.prototype);
      return gp(c.prototype, protos);
    }
    return protos;
  })(o, []);
}

(может быть) (или, может быть, нет:-) дайте мне секунду) (ну дерьмо, я думаю, что это возможно, но игнорировать этот код)

[править] wow, это полностью дует мне в голову - эта функция закрывается, но не совсем правильно; создание цепи прототипов странно, и я чувствую себя страшно и одиноко. Я предлагаю обратить внимание только на удивительную @CMS выше.

Ответ 3

Вот начальная точка:

Object.prototype.getConstructorNames=function(){
        return Object.keys(window).filter(function(e){
            return typeof window[e]==="function" && this instanceof window[e]},this)
    }

Конечно, это действительно неполно, но я думаю, что он будет работать в большинстве случаев, и если кто-то захочет добавить к нему, он может.