>  기사  >  백엔드 개발  >  javascript - js의 상속방법에 대해 해결해주세요!

javascript - js의 상속방법에 대해 해결해주세요!

WBOY
WBOY원래의
2016-09-21 14:13:02864검색

<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 상속

오염 대신 상속

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.