Какой прототип по умолчанию для пользовательских функций в JavaScript? - PullRequest
8 голосов
/ 26 февраля 2010
function f()
{
}

alert (f.prototype); // returns something like [object Object]

Насколько я понимаю, по умолчанию прототип пользовательской функции должен быть нулевым или неопределенным, может кто-нибудь пролить свет?спасибо!

См. также: Чем __proto__ отличается от constructor.prototype?

Ответы [ 3 ]

7 голосов
/ 26 февраля 2010

Свойство prototype объектов функций создается автоматически, это просто пустой объект с атрибутами свойств {DontEnum} и {DontDelete}, вы можете увидеть, как объекты функций создаются в спецификации:

Обратите внимание на шаги 9, 10 и 11:

9) Создайте новый объект, который будет построен по выражению new Object().

10) Установите для свойства конструктора Результата (9) значение F. Это свойство имеет атрибуты { DontEnum }.

11) Установите свойство прототипа F в Результат (9). Это свойство имеет атрибуты, указанные в 15.3.5.2 .

Вы можете увидеть, что это так:

function f(){
  //...
}

f.hasOwnProperty('prototype'); // true, property exist on f

f.propertyIsEnumerable('prototype'); // false, because the { DontEnum } attribute

delete f.prototype; // false, because the { DontDelete } attribute
4 голосов
/ 26 февраля 2010

Вот ссылка, описывающая наследование объекта:

http://javascript.crockford.com/prototypal.html

http://www.mollypages.org/misc/js.mp alt text
(источник: mollypages.org )

0 голосов
/ 26 февраля 2010

Это не неопределенно, потому что вы только что определили это. Тот факт, что ваш function f() объект все еще пуст , не означает, что он не определен. Он просто определен как не содержащий содержимого.

...