문제

짧은 이야기 : 나는 PHP 스타일의 getter를 원하지만 JavaScript에있는 상황에 처해 있습니다.

내 JavaScript는 Firefox에서만 실행 중이므로 Mozilla 특정 js는 나에게 괜찮습니다.

JS Getter를 만들기 위해 찾을 수있는 유일한 방법은 이름을 지정해야하지만 Getter를 정의하고 싶습니다. 모두 가능한 이름. 이것이 가능한지 확실하지 않지만 알고 싶습니다.

도움이 되었습니까?

해결책

Proxy 할 수있어! 나는 이것이 너무 행복하다! 답은 여기에 제공됩니다. Python의 __getattr__ 메소드와 동등한 JavaScript가 있습니까? . 내 말로 표현하기 위해 :

var x = new Proxy({},{get(target,name) {
  return "Its hilarious you think I have "+name
}})

console.log(x.hair) // logs: "Its hilarious you think I have hair"

승리를위한 프록시! MDN 문서를 확인하십시오. https://developer.mozilla.org/en-us/docs/web/javascript/reference/global_objects/proxy

Chrome, Firefox 및 Node.js에서 작동합니다. 단점 : IE -Freakin IE에서 작동하지 않습니다. 곧.

다른 팁

당신이 찾을 수있는 가장 가까운 것은입니다 __nosuchmethod__, 이는 JavaScript의 PHP의 __call ()에 해당합니다.

불행히도, __get/__ 세트와 동등한 것은 없습니다. 이것은 수치심입니다. 그들과 함께 우리는 __nosuchmethod__를 구현할 수 있었지만 아직 __nosuchmethod__를 사용하여 속성 (c#)을 구현하는 방법을 보지 못했습니다.

var foo = {
    __noSuchMethod__ : function(id, args) {
        alert(id);
        alert(args);
    }
};

foo.bar(1, 2);

ES6에서 코딩하는 경우 프록시와 클래스를 결합하여 PHP와 같은 멋진 코드:

class Magic {
    constructor () {
        return new Proxy(this, this);
    }
    get (target, prop) {
        return this[prop] || 'MAGIC';
    }
}

이것은 핸들러에 바인딩되므로 대상 대신에 사용할 수 있습니다.

참고 : PHP와 달리 프록시는 모든 속성 요청을 처리합니다.

let magic = new Magic();
magic.foo = 'NOT MAGIC';
console.log(magic.foo); // NOT MAGIC
console.log(magic.bar); // MAGIC

프록시를 지원하는 브라우저를 확인할 수 있습니다 http://caniuse.com/#feat=proxy 그리고 수업 http://caniuse.com/#feat=es6-class. 노드 8을 모두 지원합니다.

JavaScript 1.5 가지고 있습니다 getter/setter 구문 설탕. John Resig가 매우 잘 설명합니다 여기

웹 사용에는 일반적이지 않지만 Firefox는이 제품을 가지고 있습니다 (서버 측에서 사용하려면 Rhino).

실제로 작동하는 구현이 필요한 경우 두 번째 매개 변수를 테스트하여 길을 "속임수"할 수 있습니다. undefined, 이것은 또한 실제로 설정 매개 변수를 사용할 수 있음을 의미합니다.

var foo = {
    args: {},

    __noSuchMethod__ : function(id, args) {
        if(args === undefined) {
            return this.args[id] === undefined ? this[id] : this.args[id]
        }

        if(this[id] === undefined) {
            this.args[id] = args;
        } else {
            this[id] = args;
        }
    }
};

PHP와 같은 것을 찾고 있다면 __get() 기능, JavaScript가 그러한 구성을 제공한다고 생각하지 않습니다.

내가 생각할 수있는 최선은 객체의 비 기능 멤버를 통해 반복하고 각각의 해당 "getxyz ()"함수를 만드는 것입니다.

dodgy pseudo-ish 코드에서 :

for (o in this) {
    if (this.hasOwnProperty(o)) {
        this['get_' + o] = function() {
            // return this.o -- but you'll need to create a closure to
            // keep the correct reference to "o"
        };
    }
}

나는 내 자신의 솔루션을 구성하기 위해 Nickfs의 답변을 사용하게되었습니다. 내 솔루션은 모든 속성에 대한 get_ {propname} 및 set_ {propname} 함수를 자동으로 생성합니다. 함수가 추가하기 전에 이미 존재하는지 확인합니다. 이를 통해 기본 get 또는 설정 메소드를 자체 구현으로 대체 할 수 있습니다.

for (o in this) {
        if (this.hasOwnProperty(o)) {
            var creategetter = (typeof this['get_' + o] !== 'function');
            var createsetter = (typeof this['set_' + o] !== 'function');
            (function () {
                var propname = o;
                if (creategetter) {
                    self['get_' + propname] = function () {
                        return self[propname];
                    };
                }
                if (createsetter) {
                    self['set_' + propname] = function (val) {
                        self[propname] = val;
                    };
                }
            })();
        }
    }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top