<code>function person(name,age){ this.name = name; this.age = age; } person.prototype.say = function(){ console.log(this.name+":"+this.age); } function superman(name,age){ person.call(this,name,age); } superman.prototype = new person(); var s = new superman('superman',29); </code>
이 상속 방법을 책에서 봤는데 완벽하다고 하는데, 그렇지 않은 것 같아요. 그의 문장 superman.prototype = new person();
은 자식 클래스의 프로토타입에 부모 클래스의 인스턴스 속성을 추가하기 때문입니다. person.call(this,name,age);
부모 클래스의 인스턴스 속성을 얻었지만 이것이 하위 클래스의 프로토타입을 오염시키는 것 같습니다. 어떻게 해야 깰 수 있나요?
<code>function object(obj){ function F(){} F.prototype = obj; return new F(); } function inheritProtoType(SuperType,SubType){ var prototype = object(SuperType.prototype); prototype.constructor = SubType; SubType.prototype = prototype; } function SuperType(){ this.name = 'yuhualingfeng'; this.friends = ['David','Bob','Lucy']; } SuperType.prototype.saySuperName = function(){ console.log(this.name); }; function SubType(){ SuperType.call(this); this.age = 30; } inheritProtoType(SuperType,SubType); SubType.prototype.saySubName = function(){ console.log(this.name); }; var subType = new SubType(); </code>
<code>function person(name,age){ this.name = name; this.age = age; } person.prototype.say = function(){ console.log(this.name+":"+this.age); } function superman(name,age){ person.call(this,name,age); } superman.prototype = new person(); var s = new superman('superman',29); </code>
이 상속 방법을 책에서 봤는데 완벽하다고 하는데, 그렇지 않은 것 같아요. 그의 문장 superman.prototype = new person();
은 자식 클래스의 프로토타입에 부모 클래스의 인스턴스 속성을 추가하기 때문입니다. person.call(this,name,age);
부모 클래스의 인스턴스 속성을 얻었지만 이것이 하위 클래스의 프로토타입을 오염시키는 것 같습니다. 어떻게 해야 깰 수 있나요?
<code>function object(obj){ function F(){} F.prototype = obj; return new F(); } function inheritProtoType(SuperType,SubType){ var prototype = object(SuperType.prototype); prototype.constructor = SubType; SubType.prototype = prototype; } function SuperType(){ this.name = 'yuhualingfeng'; this.friends = ['David','Bob','Lucy']; } SuperType.prototype.saySuperName = function(){ console.log(this.name); }; function SubType(){ SuperType.call(this); this.age = 30; } inheritProtoType(SuperType,SubType); SubType.prototype.saySubName = function(){ console.log(this.name); }; var subType = new SubType(); </code>
Object.create(Person.prototype);
이 문제는 효과적으로 해결될 수 있으나 호환성에 주의해주세요
<code>function create(obj) { if (Object.create) { return Object.create(obj); } function f() {}; f.prototype = obj; return new f(); }</code>
person.prototype 상속
오염 대신 상속