Цепочка прототипов не может получить Object ()? - PullRequest
3 голосов
/ 08 июня 2011

Я прочитал статью , которая объясняет, что такое цепочка прототипов.

В нем говорится, что если я попытаюсь получить доступ к свойству объекта, но у него его нет, движок javascript попытается получить его .constructor.propotype. Если его тоже нет, попробуйте .construtor.propotype.constructor.propotype. Пока он не найдет встроенный объект ().

Но я проверяю это:

function a() {}
b = new a();

, то:

c = b.constructor.prototype

Я получаю пустой a объект.

, то:

d = c.constructor.prototype

Я получаю пустой a объект.

Это зацикливается. Независимо от того, сколько .constructor.prototype я звоню, он не может найти Object (). В чем дело? Я неправильно понимаю цепочку прототипов?

Ответы [ 2 ]

2 голосов
/ 08 июня 2011

В JS OOP свойства constructor и prototype ненадежны, так как они не установлены для вас при выполнении наследования.Вы должны вручную установить / изменить их для реализации наследования.См., Например, этот урок .

Похоже, что вы пытаетесь подняться по цепочке прототипов (проходя через .constructor.prototype), никогда не достигаете вершины Object-уровень прототипа, поскольку, когда у вас есть function a(){}, правильные свойства constructor и prototype не установлены на.Я даже не могу заставить их на a;в Chrome я получаю:

> function a(){}
undefined
> a.constructor.prototype
function Empty() {}
> a.constructor.prototype = Object.prototype
Object
> a.constructor.prototype
function Empty() {} // hmmmm, the assignment didn't take...

Конечно, среда выполнения не должна этого делать, поскольку она имеет ссылку на фактический прототип каждого объекта.Т.е. язык не выполняет поиск через .constructor.prototype, он сохраняет прототип каждого экземпляра внутри.Таким образом, вы можете увидеть, как работает цепочка поиска, если вместо .constructor.prototype вы используете .__proto__:

function a(){}
b = new a();
b.__proto__ === Object.prototype; // false
b.__proto__.__proto__ === Object.prototype; // true since we reached the top of the prototype chain

Важно отметить, что свойство __proto__ никогда не было стандартным и в ES5 было стандартизировано.немного по-другому:

obj.__proto__ === Object.getPrototypeOf(obj);

Это делает .__proto__ устаревшим.

1 голос
/ 08 июня 2011

Похоже, я задал глупый вопрос.

если A является функцией:

A.prototype.constructor === A

если A не является функцией:

A. Прототип в нормальном свойстве.

Так что (в стандарте) нет способа подняться по цепочке прототипов.

...