이 기사에서는 참고용으로 JS 객체 상속의 N 모드를 공유합니다.
1. 프로토타입 체인 상속
function Person(){}; Person.prototype = { constructor: Person, name: "Oliver" }; function People(){}; People.prototype = new Person(); People.prototype.constructor = People; People.prototype.sayName = function(){ return this.name; }; var ins = new People(); console.log(ins.sayName());
2. 생성자 차용(가짜 객체, 클래식 상속)
1. 매개변수 없음
function SuperType(){ this.color = ["red","yellow","white"]; } function SubType(){ SuperType.call(this); } var instance1 = new SubType(); var instance2 = new SubType(); instance1.color.pop(); console.log(instance1.color); //["red", "yellow"] console.log(instance2.color); //["red", "yellow", "white"]
2. 매개변수가 있습니다
function SuperType(name){ this.name = name; this.number = [21,32,14,1]; } function SubType(name,age){ SuperType.call(this,name); this.age = age; } var instance1 = new SubType("Oliver",18); var instance2 = new SubType("Troy",24); instance2.number.pop(); console.log(instance1.name + instance1.age + instance1.number); //Oliver1821,32,14,1 console.log(instance2.name + instance2.age + instance2.number); //Troy2421,32,14
3. 조합 상속(유사 고전 상속)
1. 매개변수 없음
function SuperType(){ this.color = ["red","yellow","white"]; } SuperType.prototype.sayColor = function(){ return this.color; }; function SubType(){ SuperType.call(this); this.number = 321; } SubType.prototype = new SuperType(); SubType.prototype.constructor = SubType; SubType.prototype.sayNumber = function(){ return this.number; }; var instance1 = new SubType(); var instance2 = new SubType(); instance2.color.pop(); console.log(instance1.color + instance1.number); //red,yellow,white321 console.log(instance2.color + instance2.number); //red,yellow321
2. 매개변수가 있습니다
function SuperType(name){ this.name = name; this.number = [32,1342,11,1]; } SuperType.prototype.sayName = function(){ return this.name; }; function SubType(name,age){ SuperType.call(this,name); this.age = age; } SubType.prototype = new SuperType(); SubType.prototype.constructor = SubType; SubType.prototype.sayAge = function(){ return this.age; }; var instance1 = new SubType("Oliver",18); var instance2 = new SubType("Troy",24); instance2.number.pop(); console.log(instance1.sayName() + instance1.sayAge() + instance1.number); //Oliver1832,1342,11,1 console.log(instance2.sayName() + instance2.sayAge() + instance2.number); //Troy2432,1342,11
3. 기생 결합 상속(참조 유형에 대한 가장 이상적인 패러다임)
function inheritPrototype(subType,superType){ var prototype = Object(superType.prototype); prototype.constructor = subType; subType.prototype = prototype; } function SuperType(name){ this.name = name; this.number = [321,321,43]; } SuperType.prototype.sayName = function(){ return this.name; }; function SubType(name,age){ SuperType.call(this,name); this.age = age; } inheritPrototype(SubType,SuperType); SubType.prototype.sayAge = function(){ return this.age; }; var instance1 = new SubType("Oliver",18); var instance2 = new SubType("Troy",24); instance2.number.pop(); console.log(instance1.sayName() + instance1.sayAge() + instance1.number); //Oliver18321,321,43 console.log(instance2.sayName() + instance2.sayAge() + instance2.number); //Troy24321,321
또는 다음과 같이 acquirePrototype 함수를 작성할 수 있습니다.
function inheritPrototype(SubType,SuperType){ SubType.prototype = new SuperType(); SubType.prototype.constructor = SubType; }
4. 프로토타입 상속(기생과 유사한 참조 유형 값을 공유하는 데 사용됨)
1. 기존 버전(object() 함수를 먼저 정의한 후 상속)
function object(o){ function F(){}; F.prototype = o; return new F(); } var SuperType = { name: "Oliver", number: [321,321,4532,1] }; var SubType1 = object(SuperType); var SubType2 = object(SuperType); SubType1.name = "Troy"; SubType1.number.pop(); SubType2.name = "Alice"; SubType2.number.pop(); console.log(SubType1.name + SubType2.name + SubType1.number + SubType2.number + SuperType.name + SuperType.number); //TroyAlice321,321321,321Oliver321,321
ECMAScript 버전 5(Object.create()를 직접 사용한 후 상속)
var SuperType = { name: "Oliver", number: [321,321,4532,1] }; var SubType1 = Object.create(SuperType); //省略了定义object()函数 var SubType2 = Object.create(SuperType); SubType1.name = "Troy"; SubType1.number.pop(); SubType2.name = "Alice"; SubType2.number.pop(); console.log(SubType1.name + SubType2.name + SubType1.number + SubType2.number + SuperType.name + SuperType.number); //TroyAlice321,321321,321Oliver321,321
ECMAScript 5 축약 버전(Object.create()의 두 번째 매개변수를 정의한 후 상속)
var SuperType = { name: "Oliver", number: [321,321,4532,1] }; var SubType1 = Object.create(SuperType,{ name: { value : "Troy" } }); var SubType2 = Object.create(SuperType,{ name: { value : "Alice" } }); SubType1.number.pop(); SubType2.number.pop(); console.log(SubType1.name + SubType2.name + SubType1.number + SubType2.number + SuperType.name + SuperType.number); //TroyAlice321,321321,321Oliver321,321
기생 상속(프로토타입과 유사하게 참조 유형의 값을 공유하는 데 사용됨)
function createAnother(original){ var clone = Object(original); clone.sayHi = function(){ return "Hi"; }; return clone; } var person = { name: "Oliver", number: [13,21,31,1] }; var anotherPerson = createAnother(person); anotherPerson.number.pop(); console.log(anotherPerson.sayHi() + anotherPerson.number); //Hi13,21,31 console.log(person.number); //13,21,31
위 내용은 이 글의 전체 내용입니다. 모든 분들의 공부에 도움이 되었으면 좋겠습니다.