В 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__
устаревшим.