Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Как различить методы и свойства? (https://javascript.ru/forum/dom-window/7897-kak-razlichit-metody-i-svojjstva.html)

возжаждавший 24.02.2010 23:55

Как различить методы и свойства?
 
Друзья! Как вы их различаете? Синтаксис ведь один! Вот например:
window.close это метод
window.location это свойство
ДОлжны быть какие-то тонкости, скрытые от глаз начинающих.

Очень странно.
А ещё моё непонимание тем усугубляется, что захожу по этой ссылке
http://javascript.ru/window.location
и вижу, что location это объект. Короче, у меня голова кругом идёт. Я сюда пришёл с С, там как-то попроще было.

(Был класс, были переменные типа <имя класса> и к этим переменным применялись функции, в классе определённые- суть методы. НУ и потом детали всякие. Может, и громоздче, но однозначно, то есть функция суть таковая и ничего более, а тут location и объект и свойство... бр...) ПОмогите пожалуйста разобраться. Спасибо.

Octane 25.02.2010 00:05

А что странного в том, что свойство может быть ссылкой на объект? Кроме свойств и методов есть еще сеттеры и геттеры :)

возжаждавший 25.02.2010 00:12

Мне знаете, ли не до шуток. Я и так Вам верю, что Вы много знаете, могли бы не писать ерудны, не тратит своё и моё время, если по какой-то причине не хотите помочь. Извините.

Octane 25.02.2010 00:18

В JavaScript у объекта только свойства и могут быть (если не считать сеттеров и геттеров), а метод — это просто ссылка на объект, который является функцией :)

Ну проверить тип, можно, например, так:
var obj = {
    property1: true,
    property2: {
        otherObjectProperty: 100,
    },
    property3: function () {
        return;
    }
};

alert([

    "obj.property1 is " + typeof obj.property1,
    "obj.property2 is " + typeof obj.property2,
    "obj.property3 is " + typeof obj.property3

].join("\n"));


Цитата:

Сообщение от возжаждавший
не писать ерудны

а где я ерунду написал?
Цитата:

Сообщение от возжаждавший
не тратит своё и моё время

за мое время переживать не стоит ;)

возжаждавший 25.02.2010 00:37

А различаете вы их как?
Ну с windows, думаю всё понятно. Тут все свойства и методы от зубов отскакивать должны. Но, наверное, есть же какие-то малоизвестные свойства и методы? Ну и потом могут новые прибавляться разработчиками. Или надо все запоминать?

С типами понятно, спасибо. Но вот тот же join, допустим. Я ткнул в справочник, посмотрел, для чего он нужен. Но вот что он такое- метод или свойство так и не понял, а в справочнике не написано. Ну раз он имеет аргументы, наверное метод. Неохота гадать, показывать невежество. Должно быть какое-то различие в синтаксисе, да ведь? Скобки () присутствуют не всегда.

Octane 25.02.2010 00:49

Зачем какие-то различия в синтаксисе, если у объекта могут быть только свойства? Методом, называют свойство объекта, являющееся ссылкой на функцию, потому что так привычнее, такая терминология используется в других языках, но от этого какой-то другой конструкцией в JavaScript оно не становится.

var obj = {};

obj.abc = function () {}; // здесь obj.abc — метод

obj.abc = 1; // а тут уже obj.abc — свойство
Какое может быть различие в доступе к свойствам при условии, что это свойство может быть динамически изменено?

возжаждавший 25.02.2010 01:09

Попробую разобраться, спасибо.

Octane 25.02.2010 01:12

Еще есть сеттеры и геттеры, но механизм их создания доступен JS-программисту не во всех браузерах:
var obj = {
    x: 1
};

obj.__defineSetter__("propertyX", function (a) {
    this.x = a;
});

obj.__defineGetter__("propertyX", function () {
    return this.x + 1;
});


obj.propertyX = 2;

alert(obj.x);
alert(obj.propertyX);


Так же, возможно, реализованы и window.location, и document.body.innerHTML.

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

возжаждавший 25.02.2010 01:39

А что такое свойство?
Длина это свойство, ширина свойство, цвет тоже свойство.

А вот это что?
var obj = {};
obj.abc = 1; // а тут уже obj.abc — свойство

Ну то есть я увидел создание объекта obj (Какого типа? Или это напрасный вопрос- следствие языка С?)

Но вот дальше вообще не понимаю ничё. Как может единица быть свойством? Чё-то вообще не пойму.

Ну а потом отсюда вот взял
http://www.spravkaweb.ru/javascript/...operty#anchors

var anchorCount=document.anchors.length
Как прочесть? ЕСть объект document, который обладает свойством anchors, которое В СВОЮ ОЧЕРЕДЬ также обладает свойством lenght? ПОлучается, у свойства есть свойство?

Octane 25.02.2010 01:55

Цитата:

Сообщение от возжаждавший
Какого типа?

типа Object :)

Цитата:

Сообщение от возжаждавший
Как может единица быть свойством?

obj — объект
abc — свойство объекта obj
1 — значение свойства abc

Значением свойства может быть не только примитив (число, строка и т.д.), но и ссылка (Reference) на другой объект, функцию, массив.

Цитата:

Сообщение от возжаждавший
var anchorCount=document.anchors.length
Как прочесть?

У объекта document есть свойство anchors, значением которого является ссылкой на массив. У этого массива есть свойство length.

Читайте статьи на этом сайте или для глубокого понимания Тонкости ECMAScript. Дальше теорию рассказывать не охото.

B~Vladi 25.02.2010 02:00

Цитата:

Сообщение от возжаждавший
Ну то есть я увидел создание объекта obj (Какого типа? Или это напрасный вопрос- следствие языка С?)

Тип объекта в JS - достаточно абстрактное понятие (даже typeof и тот не лишен багов). Просто нужно осознать, что в JS есть объекты различных интерфейсов (именно так мне проще было понять их различия). Т.е. мы имеем массивы, функции, переменные - всё это объекты, но с различными интерфейсами доступа (API). А т.к. это объекты - у них есть что-то общее, например динамическое изменение свойств.
Цитата:

Сообщение от возжаждавший
Как может единица быть свойством?

В твоем примере единица это значение, я не свойство. Хотя можно определить и свойство, по имени 1:)
Цитата:

Сообщение от возжаждавший
var anchorCount=document.anchors.length
Как прочесть? ЕСть объект document, который обладает свойством anchors, которое В СВОЮ ОЧЕРЕДЬ также обладает свойством lenght? ПОлучается, у свойства есть свойство?

Именно. Бывают конструкции и похуже. Например, есть объект с методом. Этот метод имеет свойство. Мы можем обращаться и к свойству метода (или к свойству свойства) и вызывать сам метод. В общем, вложенность свойств может быть любой, не зависимо от типа.

ЗЫ: Постоянно слышу от Java-программистов, мол как вы в этом JS разбираетесь? Непонятно что откуда приходит и куда уходит:D
В принципе, может быть и так, что Java Script-код после выполнения сам себя удалит и концов потом вообще не найти:D

возжаждавший 25.02.2010 02:01

Ну да. Вот написано "Переход от процедурного к объектно-ориетированному программированию может быть самым трудным моментом в обучении"
JavaScript. Библия пользователя, Гудман, Моррисон. буду её штутдировать. Спасибо всем. Если не продвинусь сам, спрашивать ничё не буду, а заброшу это дело.

B~Vladi 25.02.2010 02:05

Цитата:

Сообщение от возжаждавший
Если не продвинусь сам, спрашивать ничё не буду, а заброшу это дело.

Ну после СИ грех не продвинуцо :)

Kolyaj 25.02.2010 12:41

Цитата:

Сообщение от B~Vladi
Тип объекта в JS - достаточно абстрактное понятие

Что в нём абстрактного?

B~Vladi 25.02.2010 13:19

Цитата:

Сообщение от Kolyaj
Что в нём абстрактного?

Само по себе это абстрактное понятие. Плюс бывают ещё и разные типы этих объектов в JS. Например, функция. По логике вещей, к объекту (в понятии new Object) она отношение вообще не должна иметь.

Kolyaj 25.02.2010 13:23

Цитата:

Сообщение от B~Vladi
Само по себе это абстрактное понятие.

Я это и спросил: что в нём абстрактного?

Цитата:

Сообщение от B~Vladi
По логике вещей, к объекту (в понятии new Object) она отношение вообще не должна иметь.

По какой логике? Function является наследником Object.

1 -- число.
"a" -- строка.
[] -- объект с прототипом Array.
Что абстрактного?

B~Vladi 25.02.2010 13:28

Wikipedia:
Цитата:

По Смиту и Токи, объект - конкретный опознаваемый предмет, единица или сущность (реальную или абстрактная), имеющая четко определенное функциональное назначение в данной предметной области
Достаточно абстрактное определение, не находишь?:)
Цитата:

Сообщение от Kolyaj
По какой логике?

По моей:)
Я про то, что задачи у них совершенно разные.

B~Vladi 25.02.2010 13:33

1 -- число. Может приводиться к объекту, типа Number.
"a" -- строка. Может приводиться к объекту, типа String.
[] -- объект с прототипом Array. Уже объект, со своим интерфейсом.
{} -- Ещё один объект, но с другим интерфейсом.
И т.д...
Так кто же из них настоящий объект?

B~Vladi 25.02.2010 13:50

Епт, вот я туплю. Тип объекта с объектом перепутал:D
Нада кароче в отпуск срочно:)

Kolyaj 25.02.2010 14:41

Цитата:

Сообщение от B~Vladi
1 -- число. Может приводиться к объекту, типа Number.

Может приводится, а может не приводится. Точно также число может и к строке приводится. Также как и строка к числу. Это обычное приведение типов, список которых (вполне конкретный, а не абстрактный) есть и на этом сайте.

Цитата:

Сообщение от B~Vladi
Так кто же из них настоящий объект?

Объекты всё, кроме примитивных типов.

B~Vladi 25.02.2010 14:47

Цитата:

Сообщение от Kolyaj
Это обычное приведение типов, список которых (вполне конкретный, а не абстрактный) есть и на этом сайте.

Да по типам тут в принципе всё понятно. Ещё бы typeof работал правильно.

Kolyaj 25.02.2010 14:52

Он правильно работает.

B~Vladi 25.02.2010 14:54

Цитата:

Сообщение от Kolyaj
Он правильно работает.

typeof new Array == object

Это правильно?!
Я уже молчу про typeof null.

Kolyaj 25.02.2010 14:58

Цитата:

Сообщение от B~Vladi
Это правильно?!

Да, т.к. [] -- объект.
[] instanceof Object

Kolyaj 25.02.2010 15:01

В JS нет типа Array, есть встроенный объект Array.

B~Vladi 25.02.2010 15:17

Цитата:

Сообщение от Kolyaj
В JS нет типа Array, есть встроенный объект Array.

А какие типы тогда есть?

Kolyaj 25.02.2010 15:32

http://javascript.ru/ecma/part8#a-8

B~Vladi 25.02.2010 15:56

А new Number это же объект?!

e1f 25.02.2010 16:00

Цитата:

4.3.20 Тип Number

Тип Number - множество значений, представляющих числа. В ECMAScript множество значений представляет значения 64-битного формата чисел с двойной точностью IEEE 754, включая специальные значения "не-число" (NaN), положительную бесконечность и отрицательную бесконечность.
4.3.21 Объект Number

Объект Number(числовой объект) имеет тип Object и является экземпляром встроенного объекта Number. То есть, числовой объект создается при помощи конструктора Number директивой new, при этом в качестве аргумента конструктора передаётся число. Результирующий объект обладает неявным (безымянным) свойством, содержащим это численное значение. Объект типа Number может быть приведён к числовому значению путём вызова конструктора Number как функции (15.7.1).
Есть ТИП, а есть ОБЪЕКТ.

B~Vladi 25.02.2010 16:10

Цитата:

Сообщение от e1f
Есть ТИП, а есть ОБЪЕКТ.

Вооот. Путаница, знаете ли.

e1f 25.02.2010 17:34

Ну, кому как :)

tenshi 26.02.2010 14:14

> В JS нет типа Array, есть встроенный объект Array.
new function(){
  function f(){}
  f.apply(null,[1]) 
  f.apply(null,arguments)
  f.apply(null,{'0':1}) // внимательно читаем сообщение об ошибке
}( 1 )

Kolyaj 26.02.2010 14:19

Цитата:

Сообщение от tenshi
внимательно читаем сообщение об ошибке

И что?
внимательно читаем список типов

tenshi 26.02.2010 15:07

то, что ты ссылаешься на другой язык

Kolyaj 26.02.2010 15:22

Цитата:

Сообщение от tenshi
то, что ты ссылаешься на другой язык

Дай ссылку на нужные языки. Минимум 5 желательно, по каждому из браузеров.

micscr 26.02.2010 15:25

А я только когда начинал разбираться больше всего этому удивлялся:
var x = new Boolean(false);
if (x) alert('Ура !!!');

:D

tenshi 26.02.2010 15:40

Цитата:

Дай ссылку на нужные языки. Минимум 5 желательно, по каждому из браузеров.
может тебе ещё и диссертацию написать? х)))

Kolyaj 26.02.2010 15:44

Так о каком языке говоришь ты? И где есть спецификация этого языка?

tenshi 26.02.2010 16:00

вот, специально для тебя нашёл определение типа array

http://hg.mozilla.org/tracemonkey/fi...rray.cpp#l1269

tenshi 26.02.2010 16:03

а вот для типа object: http://hg.mozilla.org/tracemonkey/fi...jsobj.cpp#l120


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