2015-12-29 2 views
2

В следующем коде использование getPrototypeOf() и constructor.prototype дает разные значения.Почему Object.getPrototypeOf() и constructor.prototype регистрируют разные значения

function C(){ } 
function D(){ } 

C.prototype.fname = "John"; 

console.log(Object.getPrototypeOf(C)); //function() {} 
console.log(C.prototype); // C{fname: "John"} 
+0

сделал т он объясняет вам помощь? – Nirus

ответ

0
console.log(Object.getPrototypeOf(C)); 

Это возвращает прототип класса С, а не экземпляр C. Они должны возвращать один и тот же результат:

console.log(Object.getPrototypeOf(new C())); 
console.log(C.prototype); 
0

Object.getPrototypeOf(C); в основном делает то же самое, что делает C.__proto__, который является

"Указывает на объект, который использовался как прототип, когда объект был instantia Тед."

Когда был создан объект C(), это была функция. Проверьте это: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/proto

и часть описания Object.prototype от MDN:

«Все объекты в JavaScript являются потомками от Object, все объекты наследуют свойства и методы от Object.prototype, хотя они может быть переопределен (кроме объекта с нулевым прототипом, то есть Object.create (null)). "

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/prototype

Значение C.prototype просто указывает на объект, который содержит методы и свойства объекта, экземпляр из него будет наследовать (или в данном случае это было преодолено в строку), в то время как Object.getPrototypeOf(C) смотрит на начальный объект, который использовался для создания C aka C.__proto__.

+0

Можно ли это перефразировать как «когда был создан экземпляр« C() », это была функция». - - когда экземпляр 'C()' был создан, он был создан с использованием функции viz 'function() {}'. –

+0

Когда вы впервые создали 'C', вы создали его как функцию. 'function C() {}' – Sam

+0

Вы говорите: «Значение C.prototype просто указывает на объект, содержащий методы и свойства, которые он наследует». На мой взгляд, 'C' не наследуется от« C.prototype », скорее, это создаваемые объекты говорят:« var Obj = new C() », который наследует свойства и методы из' C.prototype'. –

1

Это потому, что Object.prototype.isPrototypeOf() возвращает прототип, унаследованный от его родительского конструктора.

function C(){ } 

Теперь это строится примитивного типа Function

Поэтому при вызове getPrototypeOf на C__Proto__ поиска от унаследованной родительского конструктора возвращается (Прочитано это description).

Смотрите ниже для иллюстрации: Смотрите встроенные комментарии для понимания

typeof C // "function" 
C instanceof Function // True 
Object.getPrototypeOf(C) === Function.constructor.prototype // "True" 
Function.constructor.prototype // "function(){}" 
Object.getPrototypeOf(C) // "function(){}" 

Теперь следующая часть:

C.prototype.fname = "John"; 
typeof C.prototype // object 

Следовательно, его конструктор становится C() с объектом цепочка прототипов, унаследованных от C(), который будет наследоваться при создании такого экземпляра new C()

Следовательно:

C.prototype.constructor // "function C(){}" -- Parent constructor 

Итак, когда вы LookUp Prototype на C() она возвращает prototype в наследство от его конструктора, как показано ниже

C.prototype.constructor === C //true 
C.prototype === C.prototype.constructor.prototype // True 
C.prototype.constructor.prototype // C {fname: "John"} 
C.prototype // C {fname: "John"} 

Заключение:

Если когда-нибудь вам искать прототип на поиск объектов или функций происходит в свойствах, унаследованных от его родительского конструктора.

Object.getPrototypeOf(C) === C.constructor.prototype //true 
Object.getPrototypeOf(C) === Function.prototype // true 
C.prototype === (new C()).__proto__ // true (this is for illustration only dont use __proto__ in your code) 

Object.getPrototypeOf(C) не равна C.prototype, потому что их Конструкторы разные.


Ссылки:

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