2016-12-01 2 views
0

class 다음 우리가했습니다 상상해 :전화 기본 클래스 생성자는

class A { 
     constructor(x, y, z) { 
     } 
} 

class B extends A { 
    constructor(x, y, z) { 
     super(x, y, z); 
    } 
} 

우리는 arguments 또는 나머지 인수super(...)를 호출 할 경우 :

super.apply(this, arguments); 
super.apply(this, args); 

이를 작동하지 않습니다 : super.*은 허용되지 않습니다. super().

수동으로 인수를 제공하지 않으려면 다른 방법이 있습니까?

답변

2

사용 확산 표기 :

super(...args); 

예 :

class B extends A { 
    constructor(...args) { 
     super(...args); 
    } 
} 

(. super(...arguments)도 일 것이다) 그러나이 AB에 대해 표시된 지적 가치, 당신이 돈 ' B에 대한 생성자를 모두 제공해야합니다.. 파생 클래스의 기본 생성자 ¹는 위에 표시된 것과 동일합니다.

class B extends A { 
} 

은 정확히 동일한 작업을 수행합니다.

아래의 추가 예제.

기본 클래스에는 10 개의 매개 변수 (!)가 있으며 하위 클래스에는 2 개의 매개 변수 만 필요하다고 나와 있습니다. 내 느낌은 이고 처음에는입니다. 그렇다면 : 당신이 중간에 두 가지를 의미하는 경우

class B extends A { 
    constructor(first, second, ...rest) { 
     super(first, second, ...rest); 
     // Use `first` and `second` here... 
    } 
} 

, 우리가 할 수뿐만 아니라 destructuring과 :

class B extends A { 
    constructor(...args) { 
     super(...args); 
     let {1: second, 2: third} = args; 
     // Use `second` and `third` here... 
    } 
} 

더 예 :

class A { 
 
    constructor(x, y, z) { 
 
    console.log(`A: ${x}, ${y}, ${z}`); 
 
    } 
 
} 
 

 
// No constructor defined; gets default 
 
class B1 extends A {} 
 

 
// Explicit version of the default constructor 
 
class B2 extends A { 
 
    constructor(...args) { 
 
    super(...args); 
 
    } 
 
} 
 

 
// Using `arguments` instead: 
 
class B3 extends A { 
 
    constructor() { 
 
    super(...arguments); 
 
    } 
 
} 
 

 
// If the subclass accepts different args 
 
class B4 extends A { 
 
    constructor(q, ...rest) { 
 
    super(...rest); 
 
    console.log(`B4: q = ${q}`); 
 
    } 
 
} 
 

 
class B5 extends A { 
 
    constructor(...args) { 
 
    super(...args); 
 
    // They don't have to be called `y` and `z`, I'm just being consistent 
 
    let { 1: y, 2: z } = args; 
 
    console.log(`B5: y = ${y}, z = ${z}`); 
 
    } 
 
} 
 

 
new B1(1, 2, 3); 
 
new B2(4, 5, 6); 
 
new B3(7, 8, 9); 
 
new B4('q', 'x', 'y', 'z'); 
 
new B5('first', 'second', 'third');


¹ "하위 클래스의 기본 생성자는 위에 표시된 것과 같습니다." 기본 생성자가 args를 허용하지 않고/base()을 arg가없는 Java 또는 C#과 같은 언어와 다른 점에 유의하십시오.

+0

'슈퍼 (... 인수)'나는 것 같은데요? – ankr

+0

@ankr : 아니요, 여러분이'arguments'를 사용하고 싶다면'super (... arguments) '가 될 것입니다. 나는 –

+0

을 명확히 할 것입니다. 그래서'super'는 반복을 허용합니까? –

3

class A { 
 
     constructor(x, y, z) { 
 
     console.log(x,y,z); 
 
     } 
 
} 
 

 
class B extends A { 
 
    constructor(x, y, z) { 
 
     super(...arguments); 
 
    } 
 
} 
 

 
let X = new B(1,2,3);

+0

????????????????? –

+0

Ooops, 변경을 잊어 버렸습니다 .. console.logs를 넣고 내가 원하는 부분을 추가하는 것을 잊었습니다. :) – Keith

+0

Ok ok! 이제는 의미가 있습니다; P –

관련 문제