Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   синтаксис, вопрос (https://javascript.ru/forum/misc/27595-sintaksis-vopros.html)

Kolyaj 19.04.2012 14:51

Maxmaxmахimus,
Непонятно, о чём пример.

var string = "привет";
 
alert(string.foo);
string.foo = 2;
alert(string.foo);

macdack 19.04.2012 15:14

всё же есть некоторая непоследоватльность

свойства объектов это просто переменные которые содержат значения, не более того
эти значения можно перезаписывать

здесь же нельзя сказать что это переменная
но можно было бы сказать что метод высчитывает длину строки при вызове

macdack 19.04.2012 15:16

Цитата:

Сообщение от Kolyaj (Сообщение 169871)
Maxmaxmахimus,
Непонятно, о чём пример.

var string = "привет";
 
alert(string.foo);
string.foo = 2;
alert(string.foo);

кстати да

если строка это объект то по логике этот объект может иметь свойства которые можно создать и переопределить

Kolyaj 19.04.2012 16:10

А строка и не объект :)

Mixxx 19.04.2012 16:13

Там строка не объект а просто строка.

Вот строка-объект:
var string = new String("привет");
alert(string.foo);
string.foo = 2;
alert(string.foo);



Хотя сдругой стороны
Цитата:

Сообщение от Kolyaj (Сообщение 169889)
А строка и не объект :)

Если строковой литерал сам по себе еще не объект типа String то как он может иметь прототип
<div id="SuperMegaID">Строка Из Дива</div>
<SCRIPT>
String.prototype.$$$=function()
{
	return document.getElementById(this)
}

alert(
            "SuperMegaID" . $$$().innerHTML
);
</SCRIPT>

:)

nerv_ 19.04.2012 16:37

Цитата:

Сообщение от Mixxx
Если строковой литерал сам по себе еще не объект типа String то как он может иметь прототип

интерпретатор при необходимости превращает их в объекты типа string

Mixxx 19.04.2012 20:17

Цитата:

Сообщение от nerv_ (Сообщение 169898)
интерпретатор при необходимости превращает их в объекты типа string

А как "интерпритатор" определяет когда нужно превращать а когда не надо?

почему тут не превращает?
var string = "привет";
 
alert(string.foo);
string.foo = 2;
alert(string.foo);

melky 19.04.2012 22:35

Цитата:

Сообщение от macdack (Сообщение 169709)
не правильно ли называть это не свойством строки а ее методом
то есть str.length это вызов метода, возвращающего длину, но не способного принять значение извне

это обычное свойство, у которого выставлено writable:false, enumerable:false,и configurable:false. и прикручен геттер.

var a = Object.getOwnPropertyDescriptor(new String("FOO"), "length");

var b,c = ""; for(b in a) c += b+"="+a[b]+"\n";
alert(c);


можно запилить такое же самому :

var a = {};
a["0"] = "ноль";
a["1"] = "один";
a["2"] = "два";


    Object.defineProperty(a, "length", { 
        enumerable: false,
        configurable: false,
        writeable: false,
        get: function(){ 
                for(var i = 0; i in this; i += 1) ;
                return i;
       }
    });

alert( a.length );
// заимствуем метод у массива. у нас же ARRAY-LIKE объект
Array.prototype.push.call( a, "три" );

alert(  "length: "+a.length+"\n a[3] = "+a[3]  );

Kolyaj 20.04.2012 09:39

Цитата:

Сообщение от Maxmaxmахimus
он определяет тип приметива и ищет эти свойства в прототипе приметива. кэп.

Кэп, но у примитивов нет прототипа, на то они и примитивы.

Mixxx 20.04.2012 10:31

Цитата:

у примитивов нет прототипа
Почему тогда в обоих случаях в этом примере свойство примитива string будет браться из прототипа объекта String ?
String.prototype.foo=777;
var string = "привет";
 
alert(string.foo); //777
string.foo = 2;//не перекроется
alert(string.foo);//777


Часовой пояс GMT +3, время: 12:38.