Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 控制台中正确的原型链(带有对象继承)_Javascript_Prototype - Fatal编程技术网

Javascript 控制台中正确的原型链(带有对象继承)

Javascript 控制台中正确的原型链(带有对象继承),javascript,prototype,Javascript,Prototype,请原谅我被一些有用的东西打扰了,但是没有像预期的那样出现在控制台上 考虑以下代码: function Person() {}; Person.prototype.PersonAction = function() {} console.log( new Person() ); 控制台将显示: Person {PersonAction: function} __proto__: Person PersonAction: function () {} co

请原谅我被一些有用的东西打扰了,但是没有像预期的那样出现在控制台上

考虑以下代码:

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

console.log( new Person() );
控制台将显示:

Person {PersonAction: function}
    __proto__: Person
        PersonAction: function () {}
        constructor: function Person() {}
        __proto__: Object
Person {PersonAction: function, MammalAction: function}
    __proto__: Mammal
        PersonAction: function () {}
        __proto__: Mammal
            MammalAction: function () {}
            constructor: function Mammal() {}
            __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}
    __proto__: Person
        PersonAction: function () {}
        constructor: function Person() {}
        __proto__: Object
Person {PersonAction: function, MammalAction: function}
    __proto__: Mammal
        PersonAction: function () {}
        __proto__: Mammal
            MammalAction: function () {}
            constructor: function Mammal() {}
            __proto__: Object
虽然这是可行的(我理解它为什么会以这种方式出现),但请注意
哺乳动物的两个原型,其中最上面的一个原型具有
角色动作
。这正是我所担心的

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

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

这将通过将构造函数设置回它应该是什么,并为原型使用
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

演示:

这将通过将构造函数设置回它应该是什么,并为原型使用
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

演示:

这是正确的,您使用哺乳动物的实例设置了Person原型,并添加了属性personaction

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


此处的更多信息:

这是正确的,您使用哺乳动物实例设置了Person原型,并添加了属性personaction

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


更多信息:我真的不认为这是一个bug。如果第一个例子是正确的(我相信是正确的),那么第二个也是正确的。哦,是的,你缺少了
Person.prototype.constructor
,事实上,如果你处理构造函数,你会得到同样的结果。这是jfriend00答案中的
对象。创建
位起作用。这似乎很奇怪,我假设DevTools将显示对象的
\uuuu proto\uuuuu.constructor
属性或检索用于该对象的函数的
名称
属性。它在修复后显示错误的构造函数,这看起来确实像一个bug。无论如何,建议使用
Object.create
,以避免任何实例化副作用(并以某种方式解决问题)
(new ChildC())。\uuuu proto\uuuu===ChildC.prototype
,它是
ParentC
的一个实例,这很有意义。您应该主要关注第一行中显示的内容:
Person{PersonAction:function}
表示该对象是由Person构造的,在您的示例中已经是正确的。它的原型是哺乳动物的一个例子,这在技术上也是正确的。我真的不认为这是一个错误。如果第一个例子是正确的(我相信是正确的),那么第二个也是正确的。哦,是的,你缺少了
Person.prototype.constructor
,事实上,如果你处理构造函数,你会得到同样的结果。这是jfriend00答案中的
对象。创建
位起作用。这似乎很奇怪,我假设DevTools将显示对象的
\uuuu proto\uuuuu.constructor
属性或检索用于该对象的函数的
名称
属性。它在修复后显示错误的构造函数,这看起来确实像一个bug。无论如何,建议使用
Object.create
,以避免任何实例化副作用(并以某种方式解决问题)
(new ChildC())。\uuuu proto\uuuu===ChildC.prototype
,它是
ParentC
的一个实例,这很有意义。您应该主要关注第一行中显示的内容:
Person{PersonAction:function}
表示该对象是由Person构造的,在您的示例中已经是正确的。它的原型是哺乳动物的一个例子,这在技术上也是正确的。