Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   Концепция указателей в JavaScript (https://javascript.ru/forum/project/57714-koncepciya-ukazatelejj-v-javascript.html)

kobezzza 16.08.2015 13:14

Цитата:

var a = array.get(0); //Получить нулевой индекс - да такие вот операторы на JS
Что мешает сделать просто array[0] ?

acterhd 16.08.2015 14:05

В JS нет operator overload. Так просто нельзя.
Ведь это классы а не массивы. Вот ты представь себе что будет если сделать?
extends Array

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

kobezzza 16.08.2015 14:15

Цитата:

В JS нет operator overload.
Есть. Proxy (nodejs и iojs нужно запускать с флагом --harmony_proxies)

acterhd 16.08.2015 14:30

Прокси это прокси, это отдельная фича (обертка поверх класса).
Да и в хроме нету.
Также я не вижу в Proxy столь важной функции как замещение скалярных операторов.

kobezzza 16.08.2015 14:35

Цитата:

Да и в хроме нету.
Есть, просто скрыта за флагом в about:flags.

Цитата:

Также я не вижу в Proxy столь важной функции как замещение скалярных операторов.
Поясни. Можно повесить слушатель на получение/установку значения (get/set) и как раз реализовать array[0] вместо array.get(0).

acterhd 16.08.2015 15:04

Провожу доработку, довожу до ума.

cyber 17.08.2015 13:13

Цитата:

Сообщение от kobezzza
и как раз реализовать array[0] вместо array.get(0).

Я знаю только один хак)

var arr = [];

Object.defineProperty ( arr, 0, {
	get: function () {
          alert();
    	  return 0;
        }
        set: function (val) {
          alert(val);
        }
}  );

arr [0] = 5;

console.log( arr [0] )

acterhd 17.08.2015 14:34

Cyber, Я реализовал через Proxy.
Вот обработчик для Proxy.

let _indexer = {
        get: function(obj, prop){
            return (!isNaN(prop) ? obj.get(parseInt(prop)) : obj[prop]);
        },
        set: function(obj, prop, val){
            if(!isNaN(prop)){
                obj.set(val, parseInt(prop));
            } else {
                obj[prop] = val;
            }
        }
    };


Проверяет, является ли переменная prop числом или нет. Если да, то извлечь ячейку памяти.

cyber 17.08.2015 15:02

acterhd, учитывая поддержку прокси браузерами то не особо полезно тогда)

acterhd 17.08.2015 18:13

Работает библиотека во всех браузерах, кроме Firefox.


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