2015-07-02 2 views
4

В Javascript каждая функция является объектом.Javascript - Каждая функция объекта?

function a() { 
    this.x = function() { console.log("x"); } 
} 

Здесь «a» - это функция, которая является объектом. правильно?

var b = Object.create(a); 
b.x(); //does not work!! 

Приведенный выше код будет работать, если мы уже писали -

var b = Object.create(new a()) 

Так что это означает, что только экземпляр функции является объект? а не функция?

+1

Функция - это объект, но внутри функции 'this' не является этим объектом. Это контекст, заданный вызывающим. –

+0

, если вы отметите - переменная '' 'не имеет свойства' x' :-) так и унаследовано 'b' также не имеет этого – Grundy

+1

В дополнение к комментарию Фредерика, это не только' this', не ссылка на 'a', в коде, который не работал, вы никогда не вызываете функцию, поэтому код внутри нее не был запущен. – nnnnnn

ответ

2

Они не являются примером функций, которые вы перепутали нового ключевого слова новые ключевые слова делает много вещей:

  • Новый объект создается
  • Новый объект [[Prototype]] - связанные
  • новый объект установлен как «это» обязательным для вызова функции
  • Если функция не возвращает свой собственный объект вновь вызывается функция вызова будет возвращать новый объект

В первом примере вы создаете объект из функции a, которая не имеет никакого свойства x.

В последнем вы создаете и объект объекта, возвращенного нового в() вызова, который имеет топор свойство, потому что она asigned в выполнении функции

+0

Это довольно точное объяснение. – GottZ

1

this зависит от того, как вы используете функцию a. Если вы не запускаете его как конструктор функция (вы не используете ключевое слово new), this указывает на внешний охват. Попробуйте это:

function a() { 
    this.x = function() { console.log("x"); } 
} 
a(); 
console.log(window.x()); 

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

function a() { 
    this.x = function() { console.log("x"); } 
} 
var b = new a(); // mind the "new" keyword here 
console.log(b.x()); 
console.log(window.x); 

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

function c() {}; 
c instanceof Object; // ;-) 
1
function a() { 
    this.x = function() { console.log("x"); } 
} 

var b = new a(); 

b.x(); 

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

+1

Я думаю, что ясно из вопроса, что ОП уже знает, что 'new' создает экземпляр. – nnnnnn

+0

просто хотел указать функцию больше, чем класс, чем объект –

+1

Функция не * как * объект, это * есть * объект. – nnnnnn

-1

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