在javascript中继承其他对象中的原型函数

时间:2018-03-21 16:10:51

标签: javascript inheritance prototype

我正在研究javascript中的继承,我偶然发现了一个关于共享原型函数的问题。这是我的代码:

function basicID(id,firstname,lastname){
    this.firstname=firstname;
    this.lastname=lastname;
}

basicID.prototype = {


    setFirstName:function(firstname){
        this.firstname=firstname;
  },
    setLastName:function(lastname){
        this.lastname=lastname;
  },
    getFirstName:function(){
        return this.firstname;
  },
    getLastName:function(){
        return this.lastname;
  }

};

如果通过

进行测试
var empID = new basicID();
empID.setFirstName("Pink Panther");
alert(empID.getFirstName());

效果很好。

然后我想使用以下内容创建此basicID的子类。

function advancedID(id,firstname,lastname,address,picture,accesscode){

    basicID.call(this,id,firstname,lastname);
    this.address=address;
    this.picture = picture;
    this.accesscode= accesscode;
}

advancedID.prototype = basicID.prototype;

然后通过...测试...

var employeeID = new advancedID();
employeeID.setFirstName("Black Panther");
alert(employeeID.getFirstname())

仍然有效!但是当我添加原型函数时,例如:

advancedID.prototype = {
        setAddress : function(address){
            this.address = address;
        },
        getAddress : function(address){
            return this.address;
        }
}

然后我用

测试advanceID自己的功能
employeeID.setAddress("Metropolis");
alert(employeeID.getAddress())

它不起作用!我怀疑这条线

advancedID.prototype = basicID.prototype;

对于错误。因为它改变了特定对象的原型对象。如何同时从basicID和advancedID继承这两个函数?

1 个答案:

答案 0 :(得分:0)

嗯,你没有很好地获得原型继承,但首先要做的事情是:

当你这样做时:

advancedID.prototype = {
    setAddress : function(address){
        this.address = address;
    },
    getAddress : function(address){
        return this.address;
    }
}

您正在使用此对象替换advancedID的整个原型。因此advancedIDbasicID不再共享原型。 basicID.prototype仍然是原始版本,但advancedID已更改。

如果要向原型添加属性,则应附加:

advancedID.prototype.getAddress = function() {...}

现在你会看到你保留以前的方法。

但是,如果你这样做,你会看到:

empID.getAddress();

您没有收到错误消息。你的意图是advancedID继承basicID,但实际上,现在他们都共享了原型。对一个的任何改变,反映在另一个。

使“类”继承自另一个的正确方法是:

advancedID.prototype = Object.create(basicID.prototype);

这导致:

Object.getPrototypeOf(advancedID.prototype) === basicID.prototype.

如果你提出basicID的原型,advancedID会获得新的方法,但不会发生相反的情况。

相关问题