синтаксис, вопрос
почему при вызове свойства length используется синтаксис как при обращении к свойству объекта
str = "привет" alert(str.length) obj = {"length": "пока"} alert(obj.length) // при этом не возможно изменить это свойство: str.length = 1 //но возможно: obj.length = 1 не правильно ли называть это не свойством строки а ее методом то есть str.length это вызов метода, возвращающего длину, но не способного принять значение извне |
Потому что идёт обращение к свойству объекта.
|
почему же невозможно изменить это свойство как свойство любого объекта
я говорю что это скорее метод, потому что ведет себя как метод |
у массива length readonly
|
Цитата:
|
Цитата:
же |
nasqad -1
|
почему уже оба говорят что массив?
lenght массива можно менять |
Цитата:
Вопрос в том, сделать ли длину строки её свойством или её методом. Обычно свойства представляют в программе данные, методы - действия над данными. Длина строки (количество символов в строке) - это данные, характеризующие строку, поэтому логичнее считать это свойством (возвращение длины строки считать методом, с этой точки зрения, нелогично, так как никаких действий над данными в этом случае не осуществляется, данные просто становятся доступными для использования). Про то, что вы не можете изменять длину строки путём её прямой установки при помощи оператора присваивания, вам уже ответили - данное свойство доступно только для чтения и, следовательно, недоступно для записи. Да, строки удобно рассматривать как одномерный массив символов, но это не обозначает, что строки обязаны быть в прямом смысле массивами, это вопрос стандарта языка. Если хотите это изменить, вот два варианта: 1) обратитесь в W3C и убедите их это изменить 2) сделайте свой стандарт языка (в котором length доступно для записи), создайте поддерживающий его интерпретатор и браузер с этим интерпретатором и продвиньте свои продукты на мировом рынке). |
понял спасибо
просто когда читал учебник не запомнилось что некоторые свойства только для чтения |
Maxmaxmахimus,
Непонятно, о чём пример. var string = "привет"; alert(string.foo); string.foo = 2; alert(string.foo); |
всё же есть некоторая непоследоватльность
свойства объектов это просто переменные которые содержат значения, не более того эти значения можно перезаписывать здесь же нельзя сказать что это переменная но можно было бы сказать что метод высчитывает длину строки при вызове |
Цитата:
если строка это объект то по логике этот объект может иметь свойства которые можно создать и переопределить |
А строка и не объект :)
|
Там строка не объект а просто строка.
Вот строка-объект: var string = new String("привет"); alert(string.foo); string.foo = 2; alert(string.foo); Хотя сдругой стороны Цитата:
<div id="SuperMegaID">Строка Из Дива</div> <SCRIPT> String.prototype.$$$=function() { return document.getElementById(this) } alert( "SuperMegaID" . $$$().innerHTML ); </SCRIPT> :) |
Цитата:
|
Цитата:
почему тут не превращает? var string = "привет"; alert(string.foo); string.foo = 2; alert(string.foo); |
Цитата:
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] ); |
Цитата:
|
Цитата:
String.prototype.foo=777; var string = "привет"; alert(string.foo); //777 string.foo = 2;//не перекроется alert(string.foo);//777 |
Цитата:
|
а мой пост проигнорировали :/
|
Цитата:
Цитата:
|
Нет у примитива прототипа, при обращении к свойству примитива создаётся временный объект-обёртка, к прототипу которого и идёт обращение. От того, что ты пытаешься упростить объяснение происходящего, прототип у примитива не появится.
|
Перечитай мой пост без обновления страницы, прототипов у примитивов всё равно нет.
|
Не надо придумывать абстракции на пустом месте, они имеют свойство становиться дырявыми.
|
Часовой пояс GMT +3, время: 22:54. |