Есть ли в javascript аналог __get из php?

Да, я знаю про get/set, defineProperty и т.д. Мне нужно обращение к неизвестному свойству.

Если это невозможно, то каким образом работает localStorage в Chrome Extension?

Там значения сохраняются следующим образом

localStorage['foo'] = 'bar';

Или это реализовано на более низком уровне?
  • Вопрос задан
  • 3643 просмотра
Пригласить эксперта
Ответы на вопрос 8
maxaon
@maxaon
localStorage это отдельный специально созданный объект со своим API.

Если вам необходимо обращатся к неизвестному свойству, тогда существует Proxy, однако он находятся в разработке, и пока доступны только для Gecko.
wiki.ecmascript.org/doku.php?id=harmony:direct_proxies
https://developer.mozilla.org/en-US/docs/Web/JavaS...
Ответ написан
maxaon
@maxaon
Еще есть вариант от AngularJS - сохранение состояния, потом проверка на изменения.
Как вариант - ставить сеттеры и геттеры на обнаруженные свойства. Но все это, скажем так, костыли.
Ответ написан
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
с localStorage это реализовано на более низком уровне.

А так только через getter/setter-ы только для существующих свойств. Да и не вижу смысла в этом. Возможно вам будет удобнее описать конечную задачу которую вы хотите решить при помощи "магии".
Ответ написан
mlnkv
@mlnkv
JavaScript Developer
может сделать проще
function Model() {

  this.types = {
    "phone":"phone",
    "age":"number"
  };

  this.set = function(name, val){
    if (check(val, this.type[name]) {
      this[name] = value;
    } else throw "значение не верно"    
  }
}

var model = new Model();

model.set("phone", "111-22-33");
model.set("age", 30);
Ответ написан
mlnkv
@mlnkv
JavaScript Developer
Комментировать
miraage
@miraage
Старый прогер
Object.__defineSetter__ замечательно решает Вашу задачу.
Ответ написан
Вот пример по вашему FooModel из комментария.

var Validations = {
    number: function(val) {
        return typeof val === 'number';
    }
};

function AbstractModel() {
    for (var field in this.fields)
        Object.defineProperty(this, field, createAccessor(field));
}

function createAccessor(field) {
    var private_;
    return {
        get: function() {
            return private_;
        },
        set: function(value) {
            if (Validations[this.fields[field]](value))
                private_ = value;
        },
        enumerable: true,
        configurable: true
    }
}

// usage
function FooModel() {
    AbstractModel.call(this);
}
FooModel.prototype = {
    fields: {
        age: 'number'
    }
};
var foo = new FooModel;
foo.age = 'test1';
console.log('>>', foo.age); // >> undefined
foo.age = 10;
foo.age = 'test2'
console.log('>>', foo.age); // >> 10
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы