객체 리터럴 / 이니셜 라이저의 자체 참조


705

JavaScript에서 다음과 같은 작업을 수행하는 방법이 있습니까?

var foo = {
    a: 5,
    b: 6,
    c: this.a + this.b  // Doesn't work
};

현재 양식에서이 코드는 참조 this하지 않기 때문에 참조 오류가 발생 합니다 foo. 그러나 객체 리터럴의 속성 값을 가질 수있는 방법이 선언 이전이 다른 속성에 따라 달라집니다?

답변:


744

글쎄, 내가 말할 수있는 유일한 것은 게터입니다 .

var foo = {
  a: 5,
  b: 6,
  get c() {
    return this.a + this.b;
  }
}

console.log(foo.c) // 11

이것은 ECMAScript 5th Edition Specification에 의해 도입 된 구문 확장이며, 구문은 대부분의 최신 브라우저 (IE9 포함)에서 지원됩니다.


32
매우 유용한 답변. 'get'에 대한 자세한 정보는 developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/…
jake

5
@FaustoR. 그렇습니다.
Charlie Martin

48
foo.a또는 의 값 foo.b이 변경 되면이 솔루션의 값 foo.c도 동기화되어 변경됩니다. 필요한 것일 수도 있고 아닐 수도 있습니다.
HBP

8
주의 this깊은 중첩 된 객체에 바인드를. 예 :... x: { get c () { /*this is x, not foo*/ } } ...
Z. Khullah

3
위의 진술을 완성하기 위해, foo꿀벌은 변수로 선언되어 있고 c호출 될 때만 평가 될 것이기 때문에, foo내부 cthis(주의해야합니다) 반대로 작동합니다
.

316

당신은 다음과 같은 것을 할 수 있습니다 :

var foo = {
   a: 5,
   b: 6,
   init: function() {
       this.c = this.a + this.b;
       return this;
   }
}.init();

이것은 일종의 객체 초기화 일 것입니다.

실제로의 반환 값을 init()에 지정하고 있으므로을 (를) 지정 foo해야합니다 return this.


95
당신은 또한 오염되지 않도록 delete this.init전에 할 수 있습니다return thisfoo
Billy Moon

15
@BillyMoon : 그렇습니다. 그러나 그렇게하면 많은 엔진 (예 : V8)에서 해당 객체에 대한 모든 후속 속성 액세스의 성능영향을 미칩니다 .
TJ Crowder

8
@ MuhammadUmer : ES6 클래스가 질문과 어떻게 관련이 있는지 확실하지 않습니다.
Felix Kling

8
@ MuhammadUmer : 클래스는 생성자 함수의 구문 설탕이므로 실제로 새로운 것을 제공하지 않습니다. 어느 쪽이든,이 질문의 주요 초점은 객체 리터럴입니다.
Felix Kling

3
@akantoword : Great :) 객체 리터럴이 단일 표현식이기 때문에 단일 표현식 init()을 유지하기 위해 리터럴이 직접 리터럴에 추가되었습니다. 그러나 물론 원하는대로 함수를 호출 할 수 있습니다.
Felix Kling

181

명확하고 간단한 대답이 누락되었으므로 완전성을 위해 다음을 수행하십시오.

그러나 객체 리터럴의 속성 값을 가질 수있는 방법이 선언 이전이 다른 속성에 따라 달라집니다?

아니요. 여기에있는 모든 솔루션은 객체가 생성 될 때까지 (다양한 방식으로) 지연된 다음 세 번째 속성을 할당합니다. 가장 간단한 방법은이 작업을 수행하는 것입니다 :

var foo = {
    a: 5,
    b: 6
};
foo.c = foo.a + foo.b;

다른 모든 사람들은 같은 일을하는 간접적 인 방법 일뿐입니다. (Felix는 특히 영리하지만 임시 기능을 생성 및 파괴하여 복잡성을 추가해야하며, 객체에 추가 속성을 남겨 두거나 [ delete해당 속성이있는 경우] 해당 객체에 대한 후속 속성 액세스 의 성능영향을 미칩니다 .)

모두 하나의 표현식 내에 있어야하는 경우 임시 속성없이이를 수행 할 수 있습니다.

var foo = function(o) {
    o.c = o.a + o.b;
    return o;
}({a: 5, b: 6});

또는이 작업을 두 번 이상 수행해야하는 경우 :

function buildFoo(a, b) {
    var o = {a: a, b: b};
    o.c = o.a + o.b;
    return o;
}

그런 다음 어디에 사용해야합니까?

var foo = buildFoo(5, 6);

내 정신을 위해, 기본적으로 동일한 것을 말하는 일종의 공식 문서를 찾으려고 노력하고 있습니다. 객체 this는 해당 객체의 메소드 에서만 사용할 수 있으며 다른 종류의 속성 은 사용할 수 없습니다. 어디서 찾을 수 있을지 아십니까? 감사!
David Kennell 1

1
@DavidKennell : 사양 보다 공식적이지 않습니다 . :-) 당신은 아마 여기서 시작 해서 그것을 따라갈 것입니다. 상당히 어색한 언어이지만 기본적으로 속성 정의 평가 의 다양한 하위 절 에서 속성 초기화의 값을 결정하는 작업에 객체를 사용할 수 없음을 알 수 있습니다.
TJ Crowder

여기서 browserscope 결과를 볼 수 없지만 더 이상 그렇지 않습니다. 내 환경에서 v8 : delete은 10 % 빠르며 도마뱀 delete은 1 % 느립니다.
TheMaster

1
@TheMaster-예, BrowserScope가 더 이상은 아닙니다. V8 (Chrome 등) 또는 SpiderMonkey에서는 삭제가 그다지 좋지 않은 것처럼 보입니다. 여전히 느리지 만 약간만 있으며, 요즘에는 매우 빠릅니다.
TJ Crowder

63

익명 함수를 간단히 인스턴스화하십시오.

var foo = new function () {
    this.a = 5;
    this.b = 6;
    this.c = this.a + this.b;
};

1
@ 버기, 왜? 누군가 동일한 객체를 다른 객체로 인스턴스화 할 수 있기 때문에? 객체 리터럴을 복제 할 수없는 것은 아닙니다. new Point(x, y)함수의 이름이 재사용을 위해 지정되지 않았다는 점을 제외하고 는 인수를 전달하는 것과 다르지 않습니다.
zzzzBov

1
@zzzzBov : 물론 객체를 복제 할 수는 있지만 IEFE 솔루션 (TJCrowder의 답변과 같은)과 비교하면 솔루션이 생성자 함수를 유출하고 불필요한 프로토 타입 객체를 만듭니다.
Bergi

5
@zzzzBov : var foo = function() { this.…; return this; }.call({});구문 상 크게 다르지 않지만 의미 적으로 제정신 인 것을 사용하십시오.
Bergi

1
@ Bergi, 그것이 중요하다고 생각되면 믹스에 자신의 답변을 추가하지 않겠습니까?
zzzzBov

3
당신은 이것을 가지고 있습니다. 나는 실제로 new키워드를 눈치 채지 못했다 .
랜디

26

이제 ES6에서는 지연 캐시 속성을 생성 할 수 있습니다. 처음 사용할 때이 속성은 한 번 평가되어 일반 정적 속성이됩니다. 결과 : 두 번째로 수학 함수 오버 헤드를 건너 뜁니다.

마술은 게터에있다.

const foo = {
    a: 5,
    b: 6,
    get c() {
        delete this.c;
        return this.c = this.a + this.b
    }
};

화살표에서 getter this주변 어휘 범위를 선택합니다 .

foo     // {a: 5, b: 6}
foo.c   // 11
foo     // {a: 5, b: 6 , c: 11}  

1
es5에는 또한이 Object.defineProperty(foo, 'c', {get:function() {...}})를 정의하는 데 사용해야 하는 속성이 있습니다. 이것은 이와 같은 공장에서 눈에 거슬리지 않게 쉽게 수행됩니다. 물론 get설탕을 사용할 수 있다면 설탕을 더 잘 읽을 수 있지만 그 능력이 있습니다.
Aluan Haddad

21

일부 폐쇄는이 문제를 처리해야합니다.

var foo = function() {
    var a = 5;
    var b = 6;
    var c = a + b;

    return {
        a: a,
        b: b,
        c: c
    }
}();

함수 선언에서 기대할 수있는 것처럼 내부 foo에 선언 된 모든 변수 는 private에 foo있으며 범위 내에 있기 때문에 함수에서 this예상하는 것처럼 참조 할 필요없이 서로에 액세스 할 수 있습니다. 차이점은이 함수는 전용 변수를 노출하고 해당 객체를에 할당하는 객체를 반환한다는 것입니다 foo. 결국, 당신은 return {}문장으로 객체로서 노출시키고 자하는 인터페이스만을 반환한다 .

그런 다음 함수는 마지막으로 실행되어 ()전체 foo 객체가 평가되고 인스턴스화 된 모든 변수가의 속성으로 추가됩니다 foo().


14
이것을 "폐쇄"라고 부르는 것은 혼란스럽고 오도됩니다. 함수에서 ojbect 값을 반환하는 정확한 의미에 대한 의견이 다르더라도 다른 사람의 책에서는 폐쇄되지 않습니다.

16

당신은 이렇게 할 수 있습니다

var a, b
var foo = {
    a: a = 5,
    b: b = 6,
    c: a + b
}

이 방법은 함수가 원래 선언 된 객체를 참조해야 할 때 유용하다는 것이 입증되었습니다. 다음은 내가 어떻게 사용했는지에 대한 최소한의 예입니다.

function createMyObject() {
    var count = 0, self
    return {
        a: self = {
            log: function() {
                console.log(count++)
                return self
            }
        }
    }
}

인쇄 기능이 포함 된 객체로 self를 정의하면 해당 함수가 해당 객체를 참조 할 수 있습니다. 즉, 인쇄 기능을 다른 곳에 전달해야하는 경우 인쇄 기능을 객체에 '바인드'할 필요가 없습니다.

대신 this아래 그림과 같이 사용하십시오

function createMyObject() {
    var count = 0
    return {
        a: {
            log: function() {
                console.log(count++)
                return this
            }
        }
    }
}

그런 다음 다음 코드는 0, 1, 2를 기록한 다음 오류를 발생시킵니다

var o = createMyObject()
var log = o.a.log
o.a.log().log() // this refers to the o.a object so the chaining works
log().log() // this refers to the window object so the chaining fails!

자체 방법을 사용하면 함수가 실행되는 컨텍스트에 관계없이 print가 항상 동일한 객체를 반환합니다. 위의 코드는 자체 버전을 사용할 때 정상적으로 실행되고 0, 1, 2 및 3을 기록 createMyObject()합니다.


3
모든 세미콜론을 제외하고 좋은 예입니다.

1

9

완성을 위해 ES6에는 클래스가 있습니다 (최신 브라우저에서만이를 작성할 때 지원되지만 Babel, TypeScript 및 기타 트랜스 파일러에서 사용 가능)

class Foo {
  constructor(){
    this.a = 5;
    this.b = 6;
    this.c = this.a + this.b;
  }  
}

const foo = new Foo();

7

모듈 패턴을 사용하여 수행 할 수 있습니다. 처럼:

var foo = function() {
  var that = {};

  that.a = 7;
  that.b = 6;

  that.c = function() {
    return that.a + that.b;
  }

  return that;
};
var fooObject = foo();
fooObject.c(); //13

이 패턴을 사용하면 필요에 따라 여러 foo 객체를 인스턴스화 할 수 있습니다.

http://jsfiddle.net/jPNxY/1/


2
이것은 모듈 패턴의 예가 아니라 함수일뿐입니다. foo 정의의 마지막 행이 }();인 경우 자체 실행되고 함수가 아닌 객체를 반환합니다. 또한 foo.c함수이므로 함수를 작성하면 해당 함수를 클로버하고 다음 호출을 통해 fooObject.c()실패합니다. 어쩌면이 바이올린 은 당신이 가고있는 것에 더 가깝습니다 (인스턴스화되도록 설계되지 않은 싱글 톤이기도합니다).
Hollister

2
"모듈 패턴은 원래 기존 소프트웨어 엔지니어링의 클래스에 개인 및 공개 캡슐화를 모두 제공하는 방법으로 정의되었습니다." 보낸 사람 : JavaScript 디자인 패턴 학습 . 객체는 위에서 설명한 모듈 패턴을 따르지 만 공개 및 개인 속성 / 방법을 표시하지 않기 때문에 설명하는 것이 가장 좋지 않을 수도 있습니다. 이 하나의 jsfiddle.net/9nnR5/2 는 공용 및 개인 속성 / 방법이있는 동일한 개체입니다. 그래서 둘
Rafael Rocha

6

이를 달성하는 몇 가지 방법이 있습니다. 이것이 내가 사용하는 것입니다 :

function Obj() {
 this.a = 5;
 this.b = this.a + 1;
 // return this; // commented out because this happens automatically
}

var o = new Obj();
o.b; // === 6

2
이것은 작동하지만 객체 리터럴 표기법의 장점을 제거합니다.
kpozin

사실, 객체 리터럴 태그를 원래 놓쳤습니다. 나는 주로 데이터 구조에 객체 리터럴을 사용하며, 클래스와 비슷한 추가 논리를 원할 때 마다이 이유로 함수의 결과로 객체를 만듭니다.
ken

6

생각을 위해서-타임 라인에서 객체의 속성을 배치하십시오.

var foo = {
    a: function(){return 5}(),
    b: function(){return 6}(),
    c: function(){return this.a + this.b}
}

console.log(foo.c())

위에 더 나은 답변이 있습니다 . 이것이 내가 질문 한 예제 코드를 수정 한 방법입니다.

최신 정보:

var foo = {
    get a(){return 5},
    get b(){return 6},
    get c(){return this.a + this.b}
}
// console.log(foo.c);

2
: ES6에서는 훨씬 더 우아한이 일반적인 접근을 할 수 var foo = { get a(){return 5}, get b(){return 6}, get c(){return this.a + this.b} }그래서 지금 당신은 할 수 foo.c대신 foo.c(): (서식은 더 나은 귀하의 대답에 있음을 붙여 주시기 바랍니다!)

5

객체 리터럴에서 새 함수를 만들고 생성자를 호출하면 원래 문제에서 근본적으로 벗어난 것처럼 보이므로 불필요합니다.

객체 리터럴 초기화 중에 형제 속성을 참조 할 수 없습니다.

var x = { a: 1, b: 2, c: a + b } // not defined 
var y = { a: 1, b: 2, c: y.a + y.b } // not defined 

계산 된 속성에 대한 가장 간단한 솔루션은 다음과 같습니다 (힙 없음, 함수 없음, 생성자 없음).

var x = { a: 1, b: 2 };

x.c = x.a + x.b; // apply computed property

3

여기에 게시 된 다른 답변이 더 좋지만 다음과 같은 대안이 있습니다.

  • 초기화시 값을 설정합니다 (게터가 아니거나 파생 된 것 등)
  • init()객체 리터럴 이외의 유형 이나 코드가 필요하지 않습니다.
  • 팩토리 함수 또는 기타 오브젝트 작성 메커니즘이 아닌 오브젝트 리터럴입니다.
  • 성능에 영향을 미치지 않아야 함 (초기화 제외)

자체 실행 익명 기능 및 창 저장

var foo = {
    bar:(function(){
        window.temp = "qwert";
        return window.temp;
    })(),
    baz: window.temp
};

주문이 보장됩니다 ( bar이전 baz).

window물론 오염 이 발생하지만 누군가 window.temp가 지속적이어야 하는 스크립트를 작성하는 것을 상상할 수 없습니다 . 아마도 tempMyApp당신이 편집증이라면.

또한 추악하지만 때로는 유용합니다. 예를 들어 엄격한 초기화 조건을 가진 API를 사용하고 리팩토링을 느끼지 않기 때문에 범위가 정확합니다.

그리고 물론 건조합니다.


3

이 모든 것의 핵심은 SCOPE 입니다.

자신의 인스턴스화 된 객체로 정의하려는 속성의 "부모"(부모 개체)를 캡슐화 한 다음 키워드를 사용하여 형제 속성에 대한 참조를 만들 수 있습니다. this

먼저 그렇게하지 않고 참조하면 외부 범위 를 참조한다는 것을 기억하는 것이 매우 중요 합니다. 이것이 대상 이 될 것 입니다.thisthiswindow

var x = 9   //this is really window.x
var bar = {
  x: 1,
  y: 2,
  foo: new function(){
    this.a = 5, //assign value
    this.b = 6,
    this.c = this.a + this.b;  // 11
  },
  z: this.x   // 9 (not 1 as you might expect, b/c *this* refers `window` object)
};

2
이것은 심지어 유효한 JS가 아닙니다.

2

객체가 객체를 반환하는 함수로 작성되고 ES6 객체 속성 '방법'을 사용하는 경우 가능합니다.

const module = (state) => ({
  a: 1,
  oneThing() {
    state.b = state.b + this.a
  },
  anotherThing() {
    this.oneThing();
    state.c = state.b + this.a
  },
});

const store = {b: 10};
const root = module(store);

root.oneThing();
console.log(store);

root.anotherThing();
console.log(store);

console.log(root, Object.keys(root), root.prototype);

2

다음 코드를 대안으로 사용하고 작동합니다. 그리고 변수도 배열이 될 수 있습니다. (@ 파우스 토 R.)

var foo = {
  a: 5,
  b: 6,
  c: function() {
    return this.a + this.b;
  },

  d: [10,20,30],
  e: function(x) {
    this.d.push(x);
    return this.d;
  }
};
foo.c(); // 11
foo.e(40); // foo.d = [10,20,30,40]

2

깔끔한 ES6 방법은 다음과 같습니다.

var foo = (o => ({
    ...o,
    c: o.a + o.b
  }))({
    a: 5,
    b: 6
  });
  
console.log(foo);

나는 이것을 다음과 같이하기 위해 사용한다 :

const constants = Object.freeze(
  (_ => ({
    ..._,
    flag_data: {
      [_.a_flag]: 'foo',
      [_.b_flag]: 'bar',
      [_.c_flag]: 'oof'
    }
  }))({
    a_flag: 5,
    b_flag: 6,
    c_flag: 7,
  })
);

console.log(constants.flag_data[constants.b_flag]);


1

이 솔루션은 배열이있는 중첩 된 객체에서도 작동합니다.

      Object.prototype.assignOwnProVal
     = function (to,from){ 
            function compose(obj,string){ 
                var parts = string.split('.'); 
                var newObj = obj[parts[0]]; 
                if(parts[1]){ 
                    parts.splice(0,1);
                    var newString = parts.join('.'); 
                    return compose(newObj,newString); 
                } 
                return newObj; 
            } 
            this[to] = compose(this,from);
     } 
     var obj = { name : 'Gaurav', temp : 
                  {id : [10,20], city:
                        {street:'Brunswick'}} } 
     obj.assignOwnProVal('street','temp.city.street'); 
     obj.assignOwnProVal('myid','temp.id.1');

0

이 정확한 시나리오가 다루어지지 않았기 때문에 옵션을 던졌습니다. 당신이 경우 하지 않는 원하는 c경우 업데이트 a또는 b업데이트 후 ES6 인생은 잘 작동합니다.

var foo = ((a,b) => ({
    a,
    b,
    c: a + b
}))(a,b);

내 필요에 따라 루프에서 사용되는 배열과 관련된 객체가 있으므로 일반적인 설정을 한 번만 계산하고 싶으므로 이것이 내가 가진 것입니다.

  let processingState = ((indexOfSelectedTier) => ({
      selectedTier,
      indexOfSelectedTier,
      hasUpperTierSelection: tiers.slice(0,indexOfSelectedTier)
                             .some(t => pendingSelectedFiltersState[t.name]),
  }))(tiers.indexOf(selectedTier));

속성을 설정해야하고 속성을 설정할 indexOfSelectedTier때 해당 값을 사용해야하므로 hasUpperTierSelection먼저 해당 값을 계산하여 IIFE의 매개 변수로 전달합니다


0

다른 접근 방식은 속성을 할당하기 전에 먼저 객체를 선언하는 것입니다.

const foo = {};
foo.a = 5;
foo.b = 6;
foo.c = foo.a + foo.b;  // Does work
foo.getSum = () => foo.a + foo.b + foo.c;  // foo.getSum() === 22

이를 통해 객체 변수 이름을 사용하여 이미 할당 된 값에 액세스 할 수 있습니다. 파일에
가장 적합 config.js합니다.


그것은 자체 참조가 아니라 foo문제의 객체를 가리키는 선언 된 변수 에 대한 참조입니다.
데릭 헨더슨

0
var x = {
    a: (window.secreta = 5),
    b: (window.secretb = 6),
    c: window.secreta + window.secretb
};

이것은 @slicedtoad의 답변과 거의 동일하지만 함수를 사용하지 않습니다.


-1

참고 : 이 솔루션은 Typescript를 사용합니다 (필요한 경우 TS가 컴파일하는 vanilla JS를 사용할 수 있음)

class asd {
    def = new class {
        ads= 'asd';
        qwe= this.ads + '123';
    };

    // this method is just to check/test this solution 
    check(){
        console.log(this.def.qwe);
    }
}

// these two lines are just to check
let instance = new asd();
instance.check();

여기에 클래스 표현식을 사용하여 원하는 중첩 객체 리터럴 인터페이스를 얻었습니다. 이것이 IMHO가 만드는 동안 객체의 속성을 참조 할 수있는 다음 가장 좋은 것입니다.

주목해야 할 것은이 솔루션을 사용하는 동안 객체 리터럴에서와 동일한 인터페이스를 사용한다는 것입니다. 그리고 구문은 객체 리터럴 자체에 가깝습니다 (함수 사용 등).

다음을 비교하십시오

내가 제안한 솔루션

class asd {
    def = new class {
        ads= 'asd';
        qwe= this.ads + '123';
    };

객체 리터럴이 충분하면 솔루션

var asd = {
    def : {
        ads:'asd',
        qwe: this.ads + '123';, //ILLEGAL CODE; just to show ideal scenario
    }
}

또 다른 예

여기서는이 클래스에서 여러 상대 경로를 결합 할 수 있으며 이는 객체 리터럴로는 불가능합니다.

class CONSTANT {
    static readonly PATH = new class {
        /** private visibility because these relative paths don't make sense for direct access, they're only useful to path class
         *
         */
        private readonly RELATIVE = new class {
            readonly AFTER_EFFECTS_TEMPLATE_BINARY_VERSION: fs.PathLike = '\\assets\\aep-template\\src\\video-template.aep';
            readonly AFTER_EFFECTS_TEMPLATE_XML_VERSION: fs.PathLike = '\\assets\\aep-template\\intermediates\\video-template.aepx';
            readonly RELATIVE_PATH_TO_AFTER_EFFECTS: fs.PathLike = '\\Adobe\\Adobe After Effects CC 2018\\Support Files\\AfterFX.exe';
            readonly OUTPUT_DIRECTORY_NAME: fs.PathLike = '\\output';
            readonly INPUT_DIRECTORY_NAME: fs.PathLike = '\\input';
            readonly ASSETS_DIRECTORY_NAME: fs.PathLike = '\\assets';
        };
    }
}

2
대답이 전적으로 관련이 없기 때문일 수 있습니까? 나는 downvoter가 설명해야한다는 것에 동의하지만, 당신의 대답은 분명 질문과 관련이 없습니다…
Manngo

@Manngo 지적 해 주셔서 감사합니다. 솔직히 OP와 같은 질문이며 제안한 솔루션을 사용합니다. 확실하지 않은 이유는 무엇입니까? 시간이 있다면 설명을 잘 작성하여 적어도 내가 어디에서 틀렸는 지 알 수 있도록 설명하십시오. 불행히도 이것이 왜 합리적인 해결책이 아닌지 이해하지 못합니다.
Dheeraj Bhaskar

-2

네이티브 JS를 사용하려면 다른 답변이 좋은 솔루션을 제공합니다.

그러나 다음과 같은 자체 참조 객체를 작성하려는 경우 :

{ 
  a: ...,
  b: "${this.a + this.a}",
}

해당 구문을 지원하고 기본 객체를 반환하는 self-referenced-object 라는 npm 라이브러리를 작성했습니다 .


1
제발 피하기 링크는 대답 . "외부 사이트로의 링크가 아닌 것"인 답변은 삭제 될 수 있습니다 .
Quentin

@Quentin 답변을 개선 할 수있는 방법에 대한 제안이 있습니까? 이 질문에 대한 다른 답변은 네이티브 자바 스크립트로 자체 참조 객체를 작성하는 방법을 다루지 만 포스터 원문의 구문과 유사한 구문으로 자체 참조 객체를 작성하려면 라이브러리가 나는 해결책을 찾는 다른 사람들에게 유용 할 수 있다고 썼다. 피드백을 받겠습니다.
alex-e-leon 2014 년

몇 가지 개선해야 할 부분이 있습니다. 먼저 가장 확실한 것은 백틱없이 템플릿 리터럴 구문을 사용한다는 것입니다. 귀하의 b부동산 가치는 다음과 같아야합니다 ${this.a + this.a}. 둘째, 덜 중요하게는과 같은 것을 사용하여 문자열이 아닌 숫자를 반환하려고합니다 parseInt. 마지막으로 가장 중요한 것은이 예제를 시도했을 때 OP가 요구하는 것과 같은 이유로 작동하지 않습니다. this자신의 객체 선언을 사용하는 경우 undefined를 반환합니다. @ alex-e-leon
Alec Donald Mather

@AlecDonaldMather-시간을내어 의견을 보내 주셔서 감사합니다! 프로젝트에 관심이 있다면이 토론을 github으로 옮기는 것이 좋지만 피드백에 대답하는 것이 좋습니다.-백틱 사용 : 이전 주석에서 언급 했듯이이 구문은 JS에서 지원하지 않으므로 대신 문자열을 사용합니다 js는 obj가 정의되기 전에 "this"를 해결하려고 시도하지 않기 위해 여기에 필요합니다-숫자를 반환합니다. a + b가 이미 숫자 인 경우 a와 b가 모두 a 인 경우 a + b가 숫자를 반환하므로 작동합니다 이미 숫자.
alex-e-leon

이 정의되지 않은 반환 다시 라이브러리를 사용하는 방법을 설명 할 수 있습니까? 이런 일은 일어나지 않아야하지만, 내가 빼 버린 경우가 있을까요? 즉,이 라이브러리는 문제를 완전히 해결하지 못하고 자체 트레이드 오프 세트가 있지만 개선 / 사용 개선에 관심이 있다면 알려주십시오!
alex-e-leon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.