2013-07-27 5 views
1
Function.prototype // function Empty() {} 

Как это имеет смысл? Например, если мы возьмем объект Number, мы увидим, что его прототип (Number.__proto__) равен Function.prototype, который включает в себя метод, такой как apply и call. Как я могу использовать Number.apply(..), если прототип Number - это пустая функция, а не обычный прототип объекта, как все остальные прототипы? (Прототип числа, прототип String, любой другой пользовательский прототип - это объекты, даже Object.prototype - это объект).Почему прототип функции - это функция и почему объект наследуется оттуда?

После этого, как это имеет смысл, что Object.__proto__ == Function.prototype? Объект должен быть самым высоким объектом, как он наследует от Function.prototype, когда Function наследует от .. Object.prototype!

Object instanceof Function // true 
Function instanceof Object // of course true 
Function instanceof Function // true 
+0

Номер .__ proto__? У экземпляров есть свойство .__ proto__, а не конструктор –

+0

@JuanMendes, Number - это экземпляр. каждый объект имеет '__proto__'. – Luis

+2

Я думаю, что ваш второй пункт адресован в этом [ответе] (http://stackoverflow.com/questions/650764/how-does-proto-differ-from-constructor-prototype/11249437#11249437) и его комментариях. –

ответ

1

Миклош прав, но проще говоря:

Object.__proto__ == Function означает, что Object сама является функцией, потому что это конструктор. Это не означает, что объекты, наследующие от Object, наследуют Function. Объект наследует застройщика, .prototype, а не его .__proto__

Другими словами

function Car(){} 
inst = new Car(); 
// inst inherits from Car.prototype 
// inst.__proto__ == Car.prototype; 
// Car inherits from Function.prototype because it is a function 
// Car.__proto__ == Function.prototype; 

Но это не означает, что inst наследует от Function.prototype, вы не можете назвать apply и call на нем.

// This means that Everything that inherits from function will 
console.log(`Function.prototype`) === function Empty() {} 

Другой поворот

// This means that the constructor function (Object) 
// inherits from `Function.prototype` That is, you can use call and apply, 
// And at a lower language level, you can use() and new on it. 
Object instanceof Function // true 

// It doesn't mean that instances created from Object inherit 
// from Function.prototype (can't use call/apply) 
(new Object()) instanceOf Function ? // false 
(new Object()).apply === undefined ? // true 

// This means that functions themselves are objects, everything is an object 
// They have properties like hasOwnProperty and isPrototypeOf 
// Not that everything that inherits from Object.prototype will also inherit 
// From Function.prototype 
Function instanceof Object // of course true 
+0

Ну, это имеет смысл, но как насчет 'function Empty() {}'? EDIT: 'Object .__ proto__ == Функция' даст вам значение false. 'Object .__ proto__' ссылается непосредственно на' пустую функцию' или через 'Function.prototype'? – Luis

+0

'Объект .__ proto__ == Function.prototype', как' Car .__ proto __ == Функция. прототип' в приведенном выше примере. Подумайте о 'a = new Object()' или 'a = new Function()', каждый конструктор должен быть функцией, поэтому он будет наследовать от 'Function.prototype' –

+0

@Luis он ссылается непосредственно на пустую функцию не« через », Function.prototype'. Оба являются независимыми ссылками на один и тот же объект функции 'empty function'. Если вы переназначить' Object .__ proto__', это не повлияет на 'Function.prototype' и наоборот. Мутация, конечно, видима для обоих, поскольку они ссылаются тот же объект – Esailija

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