代码之家  ›  专栏  ›  技术社区  ›  Sviat Kuzhelev

对象原型不能进行权限继承

  •  -1
  • Sviat Kuzhelev  · 技术社区  · 7 年前

    我有一个基于类继承的代码。这个 Rabbit构造函数 从继承方法 动物原型 然后创建 对象 兔子 具有 动物方法 .

    我不明白为什么兔子构装师不想继承动物。原型名称方法。它就像一只动物。原型运行,但不起作用。。。

        function Animal(name) {
          this.name = name;
          this.speed = 0;
        }
        
        Animal.prototype.run = function(speed) {
          this.speed += speed;
          console.log( this.name + ' run, speed ' + this.speed );
        };
        
        Animal.prototype.name = function(name) {
          this.name = name;
          console.log( 'Rabbit name ' + this.name );
        };
        
        Animal.prototype.stop = function() {
          this.speed = 0;
          console.log( this.name + ' stay' );
        };
        
        function Rabbit(name) {
          Animal.apply(this, arguments);
        }
        
        Rabbit.prototype = Object.create(Animal.prototype);
        Rabbit.prototype.constructor = Rabbit;
        
        Rabbit.prototype.jump = function() {
          this.speed++;
          console.log( this.name + ' jump' );
        };
        
        var rabbit = new Rabbit('Rabbit');
        
        rabbit.name(); // Error, but it must display "Rabbit"
        rabbit.run(); // works fine
        rabbit.jump(); // works fine
    2 回复  |  直到 6 年前
        1
  •  2
  •   Bergi    7 年前

    .name 不是方法,在构造函数中为其分配参数字符串。此自有属性会隐藏继承的方法。调用字符串将产生错误。

    将其更改为

    Animal.prototype.setName = function(name) {
      this.name = name;
      console.log( 'Rabbit name ' + this.name );
    };
    
    …
    
    console.log(rabbit.name); // displays "Rabbit"
    rabbit.setName("Roger"); // displays "Rabbit name Roger"
    
        2
  •  2
  •   Maciej Sikora    7 年前

    您有对象字段“name”和函数“name”。字段正在重写函数。

    解决方案相当简单-重命名一个或另一个。