в объектах javascript разделяют ли «статические» функции и функции-прототипы одно и то же пространство имен? - PullRequest
1 голос
/ 21 июля 2011

независимо от целесообразности такой схемы именования, допустимо ли следующее?

var F = function() {
  this.f1 = function() {}
}
F.f1 = function() {}

// "static" call
var v1 = F.f1();

// prototype call
var f = new F();
var v2 = f.f1();

кажется, что все должно быть в порядке, поскольку, например, переменные var и this в объектной функции не разделяют одно и то же пространство.

Ответы [ 2 ]

2 голосов
/ 21 июля 2011

Это допустимо.
Как и другие заявили, здесь нет проблем, связанных с прототипом.
Вы присоединяете 2 свойства к 2 различным объектам:

  • так называемым "статическая функция присоединена к определению функции (F)
  • , так называемая «публичная» функция присоединена к объекту, возвращенному конструктором (new F ())

, поскольку F !== new F(), это две разные вещи с разными реквизитами.

Если вы хотите использовать наследование прототипа, вы можете рассмотреть следующий пример:

 var F = function(){}
 // function visible to all of F's instances
 F.prototype.f1 = function(){console.log("I'm inherited!");}
 // a so called "static" function
 F.f1 = function(){console.log("I'm static!");}
 var instance1 = new F();
 var instance2 = new F();
 // function visible only to this instance of F
 instance1.f1 = function(){console.log("I'm visible only to this instance of F");}
2 голосов
/ 21 июля 2011

Да, это действительно.

В вашем примере, F - это функция, которой вы назначаете свойство с именем f1, которая сама является функцией. Если вам нужно изменить код на чтение f = new F(), тогда f - это объект, который наследуется от прототипа F, но они по-прежнему являются двумя различными объектами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...