Как я могу увидеть цепочку прототипов объекта 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, который описывал, как это узнать, но я не могу, чтобы жизнь меня снова находила.
Ответы
Ответ 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)
}
Конечно, это действительно неполно, но я думаю, что он будет работать в большинстве случаев, и если кто-то захочет добавить к нему, он может.