Объекты Javascript: что возвращается из конструктора объекта - PullRequest
0 голосов
/ 23 сентября 2011

Я не был уверен, как спросить это, и я прошу прощения, если это уже спрашивали, но я не мог найти это или ответ.

Что возвращается при назначении функции для переменной.

    var obj = function(){
        this.name = 'Steve';
    }
    alert( obj.name === '');//true
    obj.name = 'Mike';
    alert( obj.name === '');//true
    obj.foo = 'fall';
    alert( obj.foo );//fall

Я знаю, obj теперь является функцией / объектом, и я могу вызвать obj(). Я также знаю, что функция, прикрепленная к obj, является конструктором для новых объектов типа obj. Если я сделаю

var newObj = new obj();
alert( newObj.name );//Steve

«Стив» печатается. и т. д.

Почему к obj, кажется, прикреплено свойство с именем "name"? И почему при попытке присвоить значение этому свойству оно не присваивается?

Ответы [ 3 ]

5 голосов
/ 23 сентября 2011

Поскольку у объектов функций есть свойство name (которое, между прочим, является нестандартным), которое представляет "имя" функции, ваша функция показывает пустую строку ("") в качестве значения этого свойства, поскольку это аноним.

Например, если вы объявляете функцию с именем foo:

function foo() {}
foo.name; // "foo"


var anon = function () {};
anon.name; // "", an anonymous function

var namedFunctionExpr = function bar () {};
namedFunctionExpr.name; // "bar"

Также, как вы заметили, вы не можете изменить значение этого свойства, поскольку в большинстве реализаций оно не конфигурируемо, не перечисляемо и не доступно для записи:

Object.getOwnPropertyDescriptor(function x(){}, 'name'); 
/* logs:
{ 
  configurable: false,
  enumerable: false,
  value: "x",
  writable: false
}
*/

Помните, что это свойство нестандартное , и есть некоторые реализации, которые не поддерживают его (например, все версии IE JScript не поддерживают его)

Теперь, как предполагает @Felix, я хотел бы добавить, что this.name не имеет ничего общего со свойством name вашей функции.

В вашем примере вызов функции obj в качестве конструктора (с оператором new) устанавливает значение this для вновь созданного объекта, который наследуется от прототипа вашей функции, и вы присваиваете значение к свойству name этого нового объекта.

1 голос
/ 23 сентября 2011

Не создавая экземпляр объекта с помощью функции, используя obj.name, вы просто читаете свойство name функции.

На самом деле вы можете явно назвать функцию с синтаксисом

function foo(){

}

вы можете сделать что-то вроде:

var goo = function foo() {}

и goo.name на самом деле будет читать "foo".

Ваша декларация здесь не названа:

var obj = function(){
        this.name = 'Steve';
    }

, поэтому obj.name всегда является пустой строкой.

Подробнее вы можете прочитать здесь:

http://bonsaiden.github.com/JavaScript-Garden/#function

Однако, если вы вызываете функцию сnew, вы получаете экземпляр объекта, созданного с помощью конструктора, со всем, что унаследовано через цепочку прототипов.

Однако стоит отметить, что вы на самом деле можете вернуть любой объект из функции конструктора.По умолчанию он возвращает экземпляр объекта, но вы также можете легко вернуть другой объект, который, естественно, не будет иметь никаких свойств из прототипа.

, то есть:

function Dog() {
   this.bark = "bark!";
   return { bark: "quack"};
}

var weirdDog = new Dog();

не будет иметь weirdDog.bark === "bark".

Опять же, вы можете прочитать больше на сайте Javascript Garden для получения дополнительной информации.

0 голосов
/ 23 сентября 2011

Свойство "name" возвращает имя функции, и вы не можете установить его, потому что это свойство только для чтения.Он возвращается пустым, потому что ваша функция анонимна.

Лучше проверить эту ссылку для более подробной информации:

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/Name

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