2016-11-20 1 views
1

생성자로 만든 변수의 이름을 가져 오는 방법이 있습니까?자바 스크립트에서 생성자 이름 가져 오기

var TestFunction = function() { 
    this.name = ???(); // should return '$testName' 
} 
var $testName = new TestFunction(); 

$testName.name$testName THX에게 반환해야

+3

X/Y 문제와 유사합니다. 왜 함수가 그처럼 변수 이름을 알아낼 수 있기를 원한다고 생각합니까? 실제 * 최종 목표는 무엇입니까? –

+0

쿠키 시스템이기 때문에 test = new Cookie ('value', 10000)라고 말할 수 있으며, test.name이 테스트 인 경우 좋을 것입니다. – howtoweb

+0

나는 인수로 반복해야 할까 두려워합니다. –

답변

6

반환해야 '$ TESTNAME'당신이 함수 (변수의 결과의 이름을 알 수있는 방법을 요구하고 의미

또는 오히려 그 결과를 new이라고 부름)가 할당 될 예정입니다. 그것은하지 이상 때문에 이러한 가능성의에 대한 메커니즘이 없다, 할 수 없습니다 :

a = b = c = d = new TestFunction(); 
// or 
new TestFunction(); 
// or 
foo(new TestFunction()); 

이 ...하지만 근본적으로, 함수가 컨텍스트에 대해 아무것도 아는 어떤 사업이 없기 때문에 정말있는 것이 이외라고 프로그래머가 인수로 넘겨줌으로써 그것을 말한 것을 선택합니다. 당신이 정보를 가지고 기능을 원하는 경우

따라서, 당신이 반복적에도 불구하고, 그것을 통과해야합니다 :

var $testName = new TestFunction("$testName"); 

특별한 경우가 있어요 (전역 범위에서 변수) 여기서 이름을 반복하지 않고 만 입력하면이 함수의 인수로 전달되고 (var $testname = 부분을 벗어남) 함수에서 "변수"를 만들지 만 함수를 전역 범위에 연결하면 Bad Idea ™ 영역 깊고 깊숙한 곳. :-)

이것은 특별한 경우입니다. 이렇게하지 않는 것이 좋습니다. (대신 : squintexcellent suggestion in a comment 있었다.)

// STRONGLY RECOMMEND NOT DOING THIS 
function TestFunction(name) { 
    window[name] = this; // Creates a global 
    this.name =name; 
} 

new TestFunction("$testname"); 
console.log($testname); // {name: "$testname"} 

당신이 (당신이 브라우저에서 window를 통해 액세스 할 수 있습니다) 전역 객체의 속성을 만들 때, 그것은 전역 변수를 만들기 때문에 작동합니다.

제발 그렇게하지 마십시오. squint's Proxy idea에 대해서는 :-)


, 그것은 다음과 같이 보일 것입니다 : 단지 기능을 사용하여

// Requires ES2016 ("ES6") support in the browser 
 
// Proxy cannot be shimmed, so transpiling won't help 
 
const cookieStore = new Map(); // Our fake storage; you'd use the browser's actual cookie store 
 
function cmAccessor(name, ...args) { 
 
    if (args.length == 0) { 
 
    // Getter; you'd actually use the browser store 
 
    const entry = cookieStore.get(name); 
 
    return entry && entry.value; 
 
    } 
 
    // Setter 
 
    const [value, duration] = args; 
 
    console.log(`Setting '${name}' to '${value}' for ${duration}`); 
 
    // You'd use the real browser store here 
 
    cookieStore.set(name, {value, duration}); 
 
} 
 
const CM = new Proxy(Object.create(null), { 
 
    get(target, name) { 
 
    let result = target[name]; 
 
    if (!result) { 
 
     result = cmAccessor.bind(null, name); 
 
     target[name] = result; 
 
    } 
 
    return result; 
 
    } 
 
}); 
 
CM.cookie1("cookie1 value", 42); 
 
CM.cookie2("cookie2 value", 42); 
 
console.log(CM.cookie1()); 
 
console.log(CM.cookie2());

그러나 당신은 아마 더 나을 것, 일품 jQuery를 :

// This version is ES5 compatible 
 

 
const cookieStore = new Map(); // Our fake storage; you'd use the browser's actual cookie store 
 

 
function CM(name, value, duration) { 
 
    switch (arguments.length) { 
 
    case 0: 
 
     throw new Error("'name' is required"); 
 
    case 1: 
 
     // Getter 
 
     // You'd use the browser's real cookie store here 
 
     const entry = cookieStore.get(name); 
 
     return entry && entry.value; 
 
    default: 
 
     // Setter 
 
     console.log("Setting '" + name + "' to '" + value + "' for " + duration); 
 
     // You'd use the real cookie store here 
 
     cookieStore.set(name, {name: name, value: value}); 
 
    } 
 
} 
 

 
// Usage: 
 
CM("cookie1", "cookie1 value", 42); 
 
CM("cookie2", "cookie2 value", 42); 
 
console.log(CM("cookie1")); 
 
console.log(CM("cookie2"));

관련 문제