<span>class Animal(object): </span> <span>def walk(self): </span> <span># ... </span> <span>class Hostile(object): </span> <span>def attack(self, target): </span> <span># ... </span> <span>class Dog(Animal): </span> <span># ... </span> <span>class Cat(Animal, Hostile): </span> <span># ... </span> dave <span>= Cat(); </span>dave<span>.walk(); </span>dave<span>.attack(target); </span>
mixins 와 같은 다른 전략을 구현 하여이 문제를 피합니다. Mixins는 방법 만 포함하는 작은 클래스입니다. 이 클래스를 연장하는 대신 Mixins는 다른 클래스에 포함됩니다. 예를 들어 PHP에서 Mixins는 특성을 사용하여 구현됩니다
<: :> a 요약 : ES2015 클래스 구문
<span>class Animal(object): </span> <span>def walk(self): </span> <span># ... </span> <span>class Hostile(object): </span> <span>def attack(self, target): </span> <span># ... </span> <span>class Dog(Animal): </span> <span># ... </span> <span>class Cat(Animal, Hostile): </span> <span># ... </span> dave <span>= Cat(); </span>dave<span>.walk(); </span>dave<span>.attack(target); </span>
열거 할 수 없기 때문에 위의 것은 작동하지 않습니다. 실제로 이것은 Object.Assign (...)을 수업에서 복사하지 않습니다. 또한 한 클래스에서 다른 클래스로 메소드를 복사하는 함수를 작성하기가 어렵습니다. 그러나 각 방법을 수동으로 복사 할 수 있습니다
<span>interface Hostile { </span> <span>attack(); </span><span>} </span> <span>class Animal { </span> <span>walk(); </span><span>} </span> <span>class Dog extends Animal { </span> <span>// ... </span><span>} </span> <span>class Cat extends Animal implements Hostile { </span> <span>attack() { </span> <span>// ... </span> <span>} </span><span>} </span>
<span>class Animal { </span> <span>// ... </span><span>} </span> <span>trait Hostile { </span> <span>// ... </span><span>} </span> <span>class Dog extends Animal { </span> <span>// ... </span><span>} </span> <span>class Cat extends Animal { </span> <span>use Hostile; </span> <span>// ... </span><span>} </span> <span>class Robot { </span> <span>use Hostile; </span> <span>// ... </span><span>} </span>단점
pros
단점 종종 Java 및 C와 같은 언어에 사용되는 고전적인 상속은 클래스를 기반으로합니다. 클래스는 객체에 대한 청사진을 정의하고 객체는 클래스의 인스턴스입니다. 상속은 슈퍼 클래스에서 서브 클래스를 생성하여 달성됩니다. 반면에 JavaScript는 객체가 다른 객체에서 직접 상속되는 프로토 타입 상속을 사용합니다. 런타임에서 객체를 동적으로 확장하거나 동적으로 변경할 수 있으므로 이것은 더 유연합니다. JavaScript ES2015의 '슈퍼'키워드는 어떻게 작동합니까? JavaScript ES2015의 'Extends'키워드는 슈퍼 클래스에서 서브 클래스를 만드는 데 사용됩니다. 서브 클래스는 슈퍼 클래스의 모든 특성과 방법을 상속하지만 새 특성과 방법을 추가하거나 상속 된 것들을 무시할 수 있습니다. JavaScript에서는 프로토 타입 객체의 속성에 값을 단순히 할당하여 객체의 프로토 타입에 속성을 추가 할 수 있습니다. 이 속성은 생성자 함수에서 생성 된 모든 객체에 의해 상속됩니다.
생성자에서 객체를 구성합니다
ES2015 클래스를 사용하면 생성자의 개체를 반환하여 인스턴스를 재정의 할 수 있습니다.
pros
<span>class Foo {}
</span><span>console.log(typeof Foo); // "function"
</span>
<span>class IAnimal {
</span> <span>walk() {
</span> <span>throw new Error('Not implemented');
</span> <span>}
</span><span>}
</span>
<span>class Dog extends IAnimal {
</span> <span>// ...
</span><span>}
</span>
<span>const robbie = new Dog();
</span>robbie<span>.walk(); // Throws an error
</span>
<span>function <span>MyFunction</span> () {
</span> <span>this.myOwnProperty = 1;
</span><span>}
</span><span>MyFunction.prototype.myProtoProperty = 2;
</span>
<span>const myInstance = new MyFunction();
</span>
<span>// logs "1"
</span><span>console.log(myInstance.myOwnProperty);
</span><span>// logs "2"
</span><span>console.log(myInstance.myProtoProperty);
</span>
<span>// logs "true", because "myOwnProperty" is a property of "myInstance"
</span><span>console.log(myInstance.hasOwnProperty('myOwnProperty'));
</span><span>// logs "false", because "myProtoProperty" isn’t a property of "myInstance", but "myInstance.__proto__"
</span><span>console.log(myInstance.hasOwnProperty('myProtoProperty'));
</span>
이 기사는 Jeff Mott, Scott Molinari, Vildan Softic 및 Joan Yin이 검토 한 동료입니다. Sitepoint 콘텐츠를 최선을 다해 Sitepoint의 동료 리뷰어 덕분에!
JavaScript에서는 모든 기능과 객체에는 '프로토 타입'속성이 있습니다. 이 속성은 다른 객체 인 프로토 타입 객체에 대한 참조입니다. 함수가 만들어지면 프로토 타입 객체도 기능의 프로토 타입 속성을 통해 만들어 링크됩니다. 생성자 함수를 사용하여 객체가 생성되면 생성자의 프로토 타입에서 특성과 메소드를 상속합니다.
JavaScript는 여러 상속을 어떻게 처리합니까? JavaScript ES2015의 '생성자'는 무엇이며 상속에 어떻게 사용됩니까?
JavaScript ES2015에서 생성자는 A입니다. 클래스 내에서 객체를 작성하고 초기화하는 데 사용되는 특수 메소드. 상속의 맥락에서, 서브 클래스 생성자는 '이'키워드를 사용하기 전에 '슈퍼'키워드를 사용하여 슈퍼 클래스 생성자를 호출해야합니다. > JavaScript ES2015의 서브 클래스에서 메소드를 어떻게 재정의 할 수 있습니까? 서브 클래스에서 동일한 이름의 메소드를 단순히 정의하여 서브 클래스의 메소드를 대체 할 수 있습니다. 서브 클래스 인스턴스에서 호출 될 때 상속 된 방법 대신 새 방법이 사용됩니다.
JavaScript의 '새로운'키워드는 무엇이며 상속에 어떻게 사용됩니까? JavaScript의 객체의 프로토 타입에 속성을 어떻게 추가 할 수 있습니까?
위 내용은 JavaScript ES2015의 객체 상속 패턴의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!