2014-12-20 2 views
1

Я хочу использовать методы класса Parent в моем дочернем классе.
В классическом ООП вы просто расширяете свой дочерний класс, чтобы использовать возможности своих родителей, возможно ли это с использованием прототипа?Наследование Javascript с использованием узла

Вот моя структура файла:

Parent.js

var Parent = function(){ 
    this.add = function(num) { 
     return num + 1; 
    }; 
}; 

module.exports = Parent; 

Child.js

var Parent = require("./parent.js"), 
    util = require("util"); 

var Child = function() { 

    this.sum = function(num) { 
     // I want to be able to use Parent.add() without instantiating inside the class 
     // like this: 
     console.log(add(num)); 
    }; 
}; 

util.inherits(Child, Parent); 

module.exports = Child; 

program.js

var child = require("./child.js"); 

var Calculator = new child(); 

Calculator.sum(1); 

Очевидно, что add() не определено здесь ,
Я пробовал использовать util.inherits, но я не уверен, что это правильный подход.

Я также хотел бы спросить, является ли это хорошим шаблоном проектирования в JavaScript в целом, учитывая, что я хотел бы иметь несколько дочерних классов, наследуемых от моего родителя?

+1

Вы должны написать его как 'this.add (num)'. – Pointy

+0

А также вы должны сделать 'Parent.call (this)' в конструкторе 'Child' – Bergi

ответ

1

Есть две проблемы с вашим кодом:

Во-первых, как уже упоминалось в комментариях @Pointy, метод add в Child.js должны быть квалифицированы с this.. Это связано с тем, что использование add разрешит его в корневой области (в браузерах).

Во-вторых, вы привязываете метод add в Parent к каждому конкретному экземпляру независимо, используя this.add = function(...){...}. Привяжите его к прототипу Parent, и вы получите то, что хотите.

var Parent = function() {} 
Parent.prototype.add = function(num) { return num + 1; } 

Функция Parent.prototype.add будет выведено на все экземпляры Parent и его производных объектов.

Смежные вопросы