생성자로 만든 변수의 이름을 가져 오는 방법이 있습니까?자바 스크립트에서 생성자 이름 가져 오기
var TestFunction = function() {
this.name = ???(); // should return '$testName'
}
var $testName = new TestFunction();
$testName.name
$testName
THX에게 반환해야
생성자로 만든 변수의 이름을 가져 오는 방법이 있습니까?자바 스크립트에서 생성자 이름 가져 오기
var TestFunction = function() {
this.name = ???(); // should return '$testName'
}
var $testName = new TestFunction();
$testName.name
$testName
THX에게 반환해야
반환해야 '$ TESTNAME'당신이 함수 (변수의 결과의 이름을 알 수있는 방법을 요구하고 의미
또는 오히려 그 결과를 new
이라고 부름)가 할당 될 예정입니다. 그것은하지 이상 때문에 이러한 가능성의에 대한 메커니즘이 없다, 할 수 없습니다 :
a = b = c = d = new TestFunction();
// or
new TestFunction();
// or
foo(new TestFunction());
이 ...하지만 근본적으로, 함수가 컨텍스트에 대해 아무것도 아는 어떤 사업이 없기 때문에 정말있는 것이 이외라고 프로그래머가 인수로 넘겨줌으로써 그것을 말한 것을 선택합니다. 당신이 정보를 가지고 기능을 원하는 경우
따라서, 당신이 반복적에도 불구하고, 그것을 통과해야합니다 :
var $testName = new TestFunction("$testName");
특별한 경우가 있어요 (전역 범위에서 변수) 여기서 이름을 반복하지 않고 만 입력하면이 함수의 인수로 전달되고 (var $testname =
부분을 벗어남) 함수에서 "변수"를 만들지 만 함수를 전역 범위에 연결하면 Bad Idea ™ 영역 깊고 깊숙한 곳. :-)
이것은 특별한 경우입니다. 이렇게하지 않는 것이 좋습니다. (대신 : squint는 excellent 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"));
X/Y 문제와 유사합니다. 왜 함수가 그처럼 변수 이름을 알아낼 수 있기를 원한다고 생각합니까? 실제 * 최종 목표는 무엇입니까? –
쿠키 시스템이기 때문에 test = new Cookie ('value', 10000)라고 말할 수 있으며, test.name이 테스트 인 경우 좋을 것입니다. – howtoweb
나는 인수로 반복해야 할까 두려워합니다. –