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

Kolyaj 19.04.2012 13:51

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

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

macdack 19.04.2012 14:14

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

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

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

macdack 19.04.2012 14:16

Цитата:

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

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

кстати да

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

Kolyaj 19.04.2012 15:10

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

Mixxx 19.04.2012 15: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 15:37

Цитата:

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

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

Mixxx 19.04.2012 19:17

Цитата:

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

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

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

melky 19.04.2012 21: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 08:39

Цитата:

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

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

Mixxx 20.04.2012 09:31

Цитата:

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


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