Учитывая следующий код:
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"]
.
Действительно ли это возможно? Я полагаю, что видел ответ где-нибудь на том, Так, чтобы описанный, как узнать просто это, но я не могу ни за что в жизни найти его снова.
редактировать - Это ответ 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 выше.
Ну, связь прототипа между объектами ([[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% надежно, поскольку свойство конструктора
является изменяемым для любого объекта.