在控制台中更正原型链(具有对象继承)

时间:2014-04-25 01:20:44

标签: javascript prototype

原谅我被一些有效的东西所困扰,却没有像预期的那样出现'在控制台上。

请考虑以下代码:

function Person() {};
Person.prototype.PersonAction = function() {}

console.log( new Person() );

控制台将显示:

Person {PersonAction: function}
    __proto__: Person
        PersonAction: function () {}
        constructor: function Person() {}
        __proto__: Object

这一切都很好。现在考虑这段代码:

function Mammal() {};
Mammal.prototype.MammalAction = function() {}

function Person() {};
Person.prototype = new Mammal();
Person.prototype.PersonAction = function() {}

console.log( new Person() );

控制台将显示:

Person {PersonAction: function, MammalAction: function}
    __proto__: Mammal
        PersonAction: function () {}
        __proto__: Mammal
            MammalAction: function () {}
            constructor: function Mammal() {}
            __proto__: Object

虽然这有效(并且我理解为什么会以这种方式显示),但请注意Mammal的两个原型,其中前一个原型为PersonAction。这让我感到困扰。

我想知道是否有任何方法可以做到这一点,通过'对'我假设:

Person {PersonAction: function}
    __proto__: Person
        PersonAction: function () {}
        constructor: function Person() {}
        __proto__: Mammal
            MammalAction: function () {}
            constructor: function Mammal() {}
            __proto__: Object

2 个答案:

答案 0 :(得分:4)

这可以通过将构造函数设置回原来的值并使用Object.create()作为原型来实现:

function Mammal() {};
Mammal.prototype.MammalAction = function() {}

function Person() {};
Person.prototype = Object.create(Mammal.prototype);
Person.prototype.PersonAction = function() {}
Person.prototype.constructor = Person;

console.log( new Person() );

它在Chrome中为您提供了这个:

Person {PersonAction: function, constructor: function, MammalAction: function}
    __proto__: Person
        PersonAction: function () {}
        constructor: function Person() {}
       __proto__: Mammal
           MammalAction: function () {}
           constructor: function Mammal() {}
           __proto__: Object

演示:http://jsfiddle.net/jfriend00/CJF3L/

答案 1 :(得分:0)

这是正确的,你用一个哺乳动物的实例设置了人物原型,并添加了一个属性人员。

我认为personaction不是构造函数,所以它不应该是大写的,最好使用object.create而不是创建parent的实例来设置继承的原型部分。

此处有更多信息:Prototypical inheritance - writing up