2015-03-27 3 views
0

У меня есть запрос о цепочке прототипов объектов JavaScript. Предположу, я создаю объектЦепь прототипа JavaScript вероятного поиска бесконечного цикла

var first = { a: 1};
var second = Object.create(first);

Теперь я знаю, что если я смотрю на атрибут a на втором объекте, из-за прототипное наследование я хотел бы получить значение 1. Но если предположим, что я назначил second скрытому атрибуту __ proto__ первого объекта, не следует ли искать поиск в цикле поиска?

Вот что я имею в виду:

first.__proto__ = second;
cosole.log(second.z); //Would it keep looking for both objects in a cycle?
+0

Почему вы думаете, это может создать бесконечный цикл поиска? – jfriend00

+1

Вы пробовали это самостоятельно? – AvetisG

+0

Да, я пробовал его в консоли хром, а четвертый оператор дает циклическую ошибку прототипа. Как хром знает свою циклическую ошибку прототипа? –

ответ

1

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

Вот краткий пример того, что я имею в виду в псевдокоде, чтобы сделать его более понятным:

OBJ 1 = {a:1} 

OBJ 2 = Prototype of OBJ 1 
Prototype of OBJ 1 = OBJ 2 

print OBJ 2 

Shows: 
// Once again for clarity: 
// The reason it is not entering into an infinite loop is because 
// it doesn't iterate through the prototype object and instead it SHOWS the prototype. 
// If you later want to see what's inside of it you can do so with an extra step. 
// But it gives you minimal available information and so you see this: 

a: 1 
proto: OBJ 1 
+0

Когда мы проверяем атрибут объекта и если он не существует, объект-прототип этого объекта проверяется, и если он не доступен на этом объекте, он поднимается на цепочку прототипов до тех пор, пока не достигнет глобального прототипа объекта, который имеющий нулевой прототип. Но так как в нашем случае прототип обоих объектов указывает друг на друга, я предполагаю, что мы никогда не достигнем нулевого прототипа объекта. В chrome я запустил код, который дает ошибку «Cyclic' __ proto__' value ». Как хромовый движок JavaScript знает, что существует цикл? –

Смежные вопросы