Jump to content
  • 0

Наследование и значение преременной this


kozakmamai
 Share

Question

Всем, привет!

Вот хотел бы разобраться что за объект отдаеться переменой и сылку на какой оъект дает переменная this

Вот два примера:

Пример 1

function Class(){
this.y = 1000;
this.get = function(){
alert(this.y);
}
}
c = new Class();
c.get();// alert вернет значение "1000"

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

c = {
y:1000,
get:function(c.y)
}

Пример 2

function Class(){
this.y = 1000;
return {
get : function(){
alert(this.y);
}
}
}
c = new Class();
c.get();// alert возвращает, переменная "undefined"

Почему-то this в секции return, перезаписывает this в теле функции.

Как это работает? (может есть какие статьи, буду благодарен)

Link to comment
Share on other sites

5 answers to this question

Recommended Posts

  • 0

this обычно используется для обращения к определенному объекту... допустим кликам мы на картинку у которой onclick(test();) так вот если в функции test this будет являться именно картинкой на которую мы кликнули...

Link to comment
Share on other sites

  • 0

Дело в том, что в JavaScript есть встроенный объект Object (да, так он и называется). И когда вы объявляете this внутри функции Class, то конструктором в этом случае является собственно Class, а когда вы пытаетесь получить this из return, то конструктором будет являться Object. Это наглядно видно из следующего кода:

function Class() {
alert('Конструктор Class:\n' + this.constructor);

return {
method: function() {
alert('Конструктор Object:\n' + this.constructor);
}
}
}

var c = new Class();
c.method();

P.S. Я точно не знаю механизма, но походу когда мы пишем new Class, то это происходит примерно следующее:

1) Object().prototype = Class().prototype;

2) var c = new Object();

Могу ошибаться.

Link to comment
Share on other sites

  • 0
Как это работает? (может есть какие статьи, буду благодарен)

Как это работает описано в спецификации ECMAScript

Если упрощенно, то представь себе пресс-форму (function Class), которая штампует ноутбуки. Чтобы сделать готовую деталь, нужно подсунуть под пресс-форму заготовку и тыцуть кнопку ( new Class() ). В результате мы получим готовое изделие (var c). Нажав на ноутбуке кнопку "вкл", мы его запустим (c.method()).

Второй вариант - не пресс-форма, а пресс-форма с упаковочным станком, которая делает не просто ноутбуки, а еще и запаковывает их в коробку. У коробки нет кнопки "вкл", но есть метод "распаковать" (get). Так вот, у коробки бесполезно спрашивать, как включить ноутбук. Но коробка знает, что внутри нее есть ноут. И обращаться нужно не к this, а просто к переменной y, которая не определяется как this

function Class(){
var y = 1000;
return {
get : function(){
alert(y);
}
}
}

Link to comment
Share on other sites

  • 0

Симпатично получается. Спасибо. Вот только осталось это понять и попытаться где-то использовать ;)

А вот кстати, такой вариант ноутбука и коробки:

function Class(){
var y = 1000;
this.get = function(){alert(y)}
}
var c= new Class();
c.get();

Результат тот же. В чем же тогда разница? И если она есть, то где лучше использовать один, а где другой?

Edited by kozakmamai
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy