Как я могу видеть опытную цепочку объекта 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"].

Действительно ли это возможно? Я полагаю, что видел ответ где-нибудь на том, Так, чтобы описанный, как узнать просто это, но я не могу ни за что в жизни найти его снова.

19
задан pr1001 11 February 2010 в 05:41
поделиться

2 ответа

редактировать - Это ответ 2010 года, и он довольно устарел. С тех пор в язык добавлен API Object.getPrototypeOf () , который значительно упрощает процесс.


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

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, []);
}

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

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

3
ответ дан 30 November 2019 в 05:17
поделиться

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

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

Посмотрите на эту реализацию Джона Ресига, в ней есть подводный камень, она полагается на свойство конструктора движков, которые не поддерживают __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% надежно, поскольку свойство конструктора является изменяемым для любого объекта.

7
ответ дан 30 November 2019 в 05:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: