Экземпляр эквивалента для цепочек Object.create и prototype - PullRequest
23 голосов
/ 09 декабря 2011

Рассмотрим такой объект с цепочкой прототипов:

var A = {};
var B = Object.create(A);
var C = Object.create(B);

Как проверить во время выполнения, есть ли C в цепочке прототипов A?

instanceof не подходит, так какпредназначен для работы с функциями конструктора, которые я здесь не использую.

Ответы [ 2 ]

22 голосов
/ 06 февраля 2012

Мой ответ будет коротким ...

Вы можете использовать метод isPrototypeOf, который будет присутствовать в случае, если ваш объект наследует от прототипа Object, как в вашем примере.

пример:

A.isPrototypeOf(C) // true
B.isPrototypeOf(C) // true
Array.prototype.isPrototypeOf(C) // false

Более подробную информацию можно прочитать здесь: Сеть разработчиков Mozilla: isPrototypeOf

4 голосов
/ 09 декабря 2011

Вы можете выполнить итерацию по цепочке прототипов, вызвав Object.getPrototypeOf рекурсивно: http://jsfiddle.net/Xdze8/.

function isInPrototypeChain(topMost, itemToSearchFor) {
    var p = topMost;

    do {

        if(p === itemToSearchFor) {
            return true;
        }

        p = Object.getPrototypeOf(p); // prototype of current

    } while(p); // while not null (after last chain)

    return false; // only get here if the `if` clause was never passed, so not found in chain
}
...