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

macdack 18.04.2012 13:20

синтаксис, вопрос
 
почему при вызове свойства length используется синтаксис как при обращении к свойству объекта

str = "привет"
alert(str.length)

obj = {"length": "пока"}
alert(obj.length)

// при этом не возможно изменить это свойство:    str.length = 1
//но возможно:
obj.length = 1


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

Kolyaj 18.04.2012 13:23

Потому что идёт обращение к свойству объекта.

macdack 18.04.2012 13:55

почему же невозможно изменить это свойство как свойство любого объекта

я говорю что это скорее метод, потому что ведет себя как метод

zebra 18.04.2012 13:58

у массива length readonly

Kolyaj 18.04.2012 14:00

Цитата:

После создания объекта String это свойство остаётся неизменным. Оно обладает свойствами { DontEnum, DontDelete, ReadOnly }.
http://javascript.ru/ecma/part15#a-15.5.5.1

macdack 18.04.2012 14:08

Цитата:

Сообщение от zebra (Сообщение 169715)
у массива length readonly

строка не массив
же

macdack 18.04.2012 14:14

nasqad -1

macdack 18.04.2012 14:32

почему уже оба говорят что массив?

lenght массива можно менять

bes 18.04.2012 17:41

Цитата:

Сообщение от macdack
почему при вызове свойства length используется синтаксис как при обращении к свойству объекта

Синтаксис один и тот же как для свойств, так и для методов - точечный (обычно применяется для объектов, а строки, также как и массивы, являются объектами javascript).

Вопрос в том, сделать ли длину строки её свойством или её методом.
Обычно свойства представляют в программе данные, методы - действия над данными.
Длина строки (количество символов в строке) - это данные, характеризующие строку, поэтому логичнее считать это свойством (возвращение длины строки считать методом, с этой точки зрения, нелогично, так как никаких действий над данными в этом случае не осуществляется, данные просто становятся доступными для использования).

Про то, что вы не можете изменять длину строки путём её прямой установки при помощи оператора присваивания, вам уже ответили - данное свойство доступно только для чтения и, следовательно, недоступно для записи.

Да, строки удобно рассматривать как одномерный массив символов, но это не обозначает, что строки обязаны быть в прямом смысле массивами, это вопрос стандарта языка.
Если хотите это изменить, вот два варианта:
1) обратитесь в W3C и убедите их это изменить
2) сделайте свой стандарт языка (в котором length доступно для записи), создайте поддерживающий его интерпретатор и браузер с этим интерпретатором и продвиньте свои продукты на мировом рынке).

macdack 19.04.2012 13:08

понял спасибо

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

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

Kolyaj 20.04.2012 10:39

Цитата:

Сообщение от Mixxx
Почему тогда в обоих случаях в этом примере свойство примитива string будет браться из прототипа объекта String ?

Я пока не буду говорить, я тут Maxmaxmахimus-а экзаменую :)

melky 20.04.2012 12:26

а мой пост проигнорировали :/

nerv_ 20.04.2012 16:01

Цитата:

Сообщение от Mixxx
Почему тогда в обоих случаях в этом примере свойство примитива string будет браться из прототипа объекта String ?

Цитата:

Сообщение от Kolyaj
Я пока не буду говорить, я тут Maxmaxmахimus-а экзаменую

Мне тоже, как новичку, любопытно. С Вашего позволения :) , ответил в личку

Kolyaj 20.04.2012 16:41

Нет у примитива прототипа, при обращении к свойству примитива создаётся временный объект-обёртка, к прототипу которого и идёт обращение. От того, что ты пытаешься упростить объяснение происходящего, прототип у примитива не появится.

Kolyaj 20.04.2012 16:44

Перечитай мой пост без обновления страницы, прототипов у примитивов всё равно нет.

Kolyaj 20.04.2012 16:53

Не надо придумывать абстракции на пустом месте, они имеют свойство становиться дырявыми.


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