【问题标题】:Something wrong when reset the javascript constructor重置 javascript 构造函数时出现问题
【发布时间】:2018-10-14 12:34:48
【问题描述】:

我正在尝试理解 javascript 中的继承。 我编写了一个基本示例来实现父对象和子对象之间的简单继承。但是我认为重置构造函数时有问题。

function Mammal(){
}
function Dog(){

}
Mammal.prototype.walk = function(){
    console.log('walking..walking....');
}
Dog.prototype.bark = function(){
    console.log('wof wof!');
}

Dog.prototype = Object.create(Mammal.prototype);
Dog.prototype.constructor = Dog;
let dogInstance = new Dog();
dogInstance.walk();
dogInstance.bark();

【问题讨论】:

  • "我认为重置构造函数时有问题。" - 什么你认为那行有问题吗?

标签: javascript oop inheritance prototype


【解决方案1】:

我认为重置构造函数时有问题。

不,there's not

你的问题是你这样做

Dog.prototype = Object.create(Mammal.prototype);

在旧的 Dog.prototype 对象上创建了 bark 方法之后 - 您正在用一个新的空对象覆盖它。只需在任何作业之前完成:

function Mammal() {
}
Mammal.prototype.walk = function(){
    console.log('walking..walking....');
};

function Dog() {
}
Dog.prototype = Object.create(Mammal.prototype); // do this before creating properties
Dog.prototype.constructor = Dog;
Dog.prototype.bark = function() {
    console.log('wof wof!');
};

【讨论】:

    【解决方案2】:

    这里有问题Dog.prototype = Object.create(Mammal.prototype);
    试试看

    [编辑]

    function Mammal() {}
    function Dog() {}
    Mammal.prototype.walk = function () {
        console.log( 'walking..walking....' );
    };
    Dog.prototype.bark = function () {
        console.log( 'wof wof!' );
    };
    

    [/编辑]

    let describe = Object.getOwnPropertyDescriptor;
    let descriptor = Object.keys( Mammal.prototype ).reduce( function ( desc, key ) {
        desc[key] = describe( Mammal.prototype, key );
        return desc;
    }, {} );
    Dog.prototype = Object.create( Dog.prototype, descriptor );
    

    [编辑]

    Dog.prototype.constructor = Dog;
    let dogInstance = new Dog();
    dogInstance.walk();
    dogInstance.bark();
    

    或者使用对象继承遵循这个

    function Mammal( key ) { this.key = key; }
    function Dog() {
        Mammal.call( this, "Dog" );
    }
    Dog.prototype = Object.create( Mammal.prototype );
    Dog.prototype.bark = function () {
        console.log( 'wof wof!' );
    };
    Mammal.prototype.walk = function () {
        console.log( 'walking..walking....' );
        return `${this.key} from Mammal.`;
    };
    Dog.prototype.constructor = Dog;
    let dogInstance = new Dog();
    dogInstance.walk();
    dogInstance.bark();
    

    比较 dogInstance

     Mammal.prototype.isPrototypeOf( dogInstance );
     Dog.prototype.isPrototypeOf( dogInstance );
    

    这对我有用:(

    [/编辑]

    【讨论】:

      【解决方案3】:

      我对此并不完全确定,但这条线是问题所在:

      Dog.prototype = Object.create(Mammal.prototype);
      

      显然你不能将 Mammal 原型直接提供给 Dog 原型

      function Mammal() {
      }
      function Dog() {
      
      }
      Mammal.prototype.walk = function () {
      	console.log( 'walking..walking....' );
      }
      Dog.prototype.bark = function () {
      	console.log( 'wof wof!' );
      }
      
      Dog.prototype.mammal = Object.create( Mammal.prototype );
      Dog.prototype.constructor = Dog;
      let dogInstance = new Dog();
      dogInstance.mammal.walk();
      dogInstance.bark();

      这似乎有效

      【讨论】:

      • 在他的 sn-p 上运行你的修复似乎并不能解决问题。现在它甚至无法识别walk 函数。
      • 好的...我正在尝试这个小提琴jsfiddle.net/3bv7nw2g 并更新了答案...你修改了这一行吗? dogInstance.mammal.walk();
      猜你喜欢
      • 2021-04-05
      • 2014-11-17
      • 1970-01-01
      • 1970-01-01
      • 2012-10-26
      • 1970-01-01
      • 2017-02-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多