2011-12-27 3 views
3

мы можем увидетьЯвляются ли функции javascript также своего рода объектом?

function generate() { 

this.a = 'hello'; 

} 

obj = new generate(); 

так, мой вопрос, как понять «это». явление?

+0

возможно дубликат [Что такое «это» до того, как объект конкретизируется в УД] (http://stackoverflow.com/questions/1283636/what-is-this-before- a-object-is-instanceiated-in-js) – Thilo

ответ

2

Да, функции - это объекты.

Но есть еще кое-что, чем в вашем примере кода. Если вы вызываете функцию с помощью ключевого слова new, JavaScript создает для вас новый объект, а затем использует эту функцию в качестве конструктора: внутри функции this ссылается на вновь созданный объект, и новый объект будет возвращен, но этот новый объект не является сама функция: для упрощения, если ваша функция равна generate(), тогда новый объект основан на generate.prototype, который по умолчанию является пустым объектом.

Дальнейшее чтение: https://developer.mozilla.org/en/Introduction_to_Object-Oriented_JavaScript

+0

Можете ли вы дать более конкретное объяснение процесса нового generate()? – Determinant

+0

Считаете ли вы страницу, на которую я связан? Или вот еще одна статья об этом (с диаграммами): http://mckoss.com/jscript/object.htm – nnnnnn

+0

Извините, я не смог открыть ее только сейчас. спасибо ~ Я думаю, что у меня есть ответ. Кстати, есть ли у вас хорошие материалы об изучении Javascript? – Determinant

1

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

доказательство: typeof(function(){}) возвращает "function"

Использование в "this" в функции Ofter используется для описания псевдо конструктор:

Поскольку не существует никаких классов в JavaScript (JS полностью декларативной), способ сделать что-то подобное - фактически написать функции, которые будут влиять на экземпляр self (this). В вашем случае вызов вашей функции «генерировать» с помощью «нового» оператора фактически создаст пустой объект, а затем выкинет «сгенерированную» функцию, как если бы она была в самом объекте. Затем у вас есть способ построить объект, содержащий общедоступное значение «a», содержащее «привет».

ОК, чтобы уточнить, как работают эти псевдоконструкторы: Во-первых, почему бы нет конструктора? Просто потому, что мы описываем текущий объект, а не создаем его из класса. (Помните, нет классов в JavaScript)

function pseudoClass() 
    { 
    this.a = "hello";// This is a public variable. See below for example 
    var b = "hi"; // This is a private variable i.e. accessible only within the scope of those brackets 
     c = "ciao"; // This is a global variable, usually pretty bad to put that here... but why not 

    alert(this.a); // Alerts "hello" as this is the current object; 
    alert(a);  // Error, "a" is not a local variable, only the current object one (would be undefined) 
    alert(b);  // Alerts "hi", b is accessible as long as we are within the same brackets (scope) as where it does have been described. 
    alert(c);  // Alerts "ciao", "c" is now available everywhere… 
    } 

Тогда из-за пределов

var o = new pseudoClass(); 
alert(o.a); // Alerts "hello", remember "a" is public and then accessible from the outside 
alert(o.b); // Will not work, b is private… 
alert(o.c); // Will not work, c is global and therefore not related to o. 
alert(c); // Alerts "ciao", c being global, once defined it is available everywhere. 

явно "о" выглядит следующим образом:

{"a":"hello"} 

Обратите внимание, что вы могли бы затрагиваемой функции на « «(публичный) и« b »(частный), так же, как вы их затронули« Строки », т.е. this.a = function(){ /* do Something */} и var b = function(){ /* do Something else */}. (звонок извне тогда o.a();)

+0

Функции _are_ objects. Попробуйте 'function test() {}', а затем 'test.prop =" 1 ";' – nnnnnn

+0

ok это объект первого класса, но они сами по себе не являются чистыми объектами. То, что я думал, что путало в вопросе, было использование «этого» оператора после «нового». Что в этом случае функция работает на новом созданном объекте, а не на самой функции. –

+0

Что такое «чистый объект»?Я не понимаю различия, которые вы пытаетесь сделать. – nnnnnn

Смежные вопросы