Это, как говорит Шон: вы на самом деле не создаете новую ссылку на объект (создаете контекст this ), потому что вы просто вызываете конструктор, а не используете конструктор для создания новогообъект.Если вы используете ключевое слово new , оно работает просто превосходно.
Поскольку область действия test () равна window , когда вы его вызываете,любая функция, вызываемая из test () , будет выполняться в области window .
Используя ключевое слово new , вы выделяете новый объект в память и создаете новую область.
Например, попробуйте это в firebug:
var myFunction = function() {
this.memberVariable = "foo";
console.log(this);
}
myFunction();
console.log(window.memberVariable);
var myObject = new myFunction();
console.log(myObject.memberVariable);
Вы увидите этот результат:
Window stats
foo
Object { memberVariable="foo"}
foo
Базовый объект Function имеет метод call () , который, как обрисовал в общих чертах Крейг, позволяет вам явно указыватьв какой области должна запускаться функция:
var myFunction = function() {
this.memberVariable = "foo";
}
myFunction.call(myFunction);
console.log(myFunction); // "Function()"
console.log(myFunction.memberVariable); // "foo"
Это, однако, не самый предпочтительный способ работы, так как вы на самом деле не создаете новый объект здесь, а typeof myFunction по-прежнему будет возвращать функцию"вместо" объект "- когда вы действительно просто хотели создать объект.