Как я могу определить получатель и установщик по умолчанию, используя ECMAScript 5? - PullRequest
8 голосов
/ 24 июня 2010

Как мне указать метод получения по умолчанию для прототипа?Под получателем по умолчанию я имею в виду функцию, которая вызывается, если вызывается obj.undefinedProperty123.

Я пытался Object.prototype.get = function (property) {..}, но в этом случае это не вызывается.

Ответы [ 5 ]

8 голосов
/ 29 сентября 2014

В ECMAScript 5 вы можете перехватывать операции get / set только для определенных именованных свойств (не для всех свойств) через Object.defineProperty:

Object.defineProperty(someObj, "someProp", {
    get: function() {
        console.log("you tried to get someObj.someProp");
        return "foo";
    }
});

Здесь get функция будет запускаться каждый раз, когда код пытается прочитать someObj.someProp.

В следующем проекте ECMAScript 6 это будет возможно через прокси .Прокси имеет базовый целевой объект и функции set / get.Каждый раз, когда операция set или get происходит с любым из свойств прокси, соответствующая функция запускается, принимая в качестве аргументов целевой объект прокси, используемое имя свойства и значение, используемое при попытке set.

var proxyHandler = {
    get: function(obj, name){
        console.log("you're getting property " + name);
        return target[name];
    },
    set: function(obj, name, value) {
        console.log("you're setting property " + name);
        target[name] = value;
    }
}

var underlyingObj = {};

// use prox instead of underlyingObj to use get/set interceptor functions
var prox = new Proxy(underlyingObj, proxyHandler);

Здесь установка значения свойства на prox приведет к запуску функций set / get.

4 голосов
/ 05 июля 2010

Что сказал Гарет, кроме того, что это __noSuchMethod__.

Или, может быть, вы думали о PHP?

Вот очень хорошая статья о недавно стандартизированных методах получения / установки свойств, выделяющая некоторые предыдущиенестандартные воплощения.

http://whereswalden.com/2010/04/16/more-spidermonkey-changes-ancient-esoteric-very-rarely-used-syntax-for-creating-getters-and-setters-is-being-removed/

Резюме: нет стандартного универсального метода получения / установки (пока), но Object.defineProperty является будущим.

3 голосов
/ 18 декабря 2012

Вам нужно дождаться внедрения системы ECMA6 «Proxy», предназначенной именно для этого. Смотри http://wiki.ecmascript.org/doku.php?id=harmony:direct_proxies.

2 голосов
/ 25 июня 2010

Firefox возможно с нестандартным noSuchMethod: -

({__noSuchMethod__:function(){alert(1);}}).a();
0 голосов
/ 24 июня 2010

Я не уверен в том, что вы спрашиваете. Но если вы хотите, чтобы метод вызывался, когда пользователь пытается получить доступ object.nonExistingProperty. Я не думаю, что есть какой-либо способ сделать это.

...