В javascript вы можете создать подкласс другого, установив прототип подкласса для экземпляра базового класса:
function BaseClass() {
this.baseFunction = function() {
};
};
function SubClass() {
};
SubClass.prototype = new BaseClass;
SubClass.prototype.someFunction = function() {
};
// create an instance of SubClass
var obj = new SubClass;
// SubClass truly extends BaseClass
obj instanceof BaseClass // true
obj instanceof SubClass // true
// the instance has both methods of BaseClass and SubClass
typeof obj.someFunction // Function
typeof obj.baseFunction // Function
Это эквивалент class SubClass extends BaseClass
в Java.
Если после этого вы также измените прототипы.
Если вы добавите функции и свойства в прототип конструктора объекта, функции и свойства будут доступны во всех экземплярах.
Вот пример:
function Thing (val){
this.value = val;
}
var bob = new Thing("bob");
console.log(bob.foo); // undefined
Thing.prototype.foo = function() {
console.log('foo!');
};
console.log(bob.foo); // function()
bob.foo(); // foo!
Теперь, если вы хотите расширить все экземпляры Thing с помощью Base, вы можете сделать это следующим образом:
var base = new Base;
for (var k in base) {
Thing.prototype[k] = base[k];
}
Или если вы хотите, чтобы экземпляры Thing расширяли Base: (т.е. не переопределяйте методы, которые уже есть в Thing)
var base = new Base;
for (var k in base) {
if (Thing.prototype[k]) continue;
Thing.prototype[k] = base[k];
}
Если вы хотите расширить только уникальный экземпляр объекта, просто присвойте ему:
var bob = new Thing("bob");
var base = new Base();
bob.sayHi = base.sayHi;
bob.sayHi();
Вы также можете вызывать функцию в контексте объекта, даже не назначая функцию объекту:
var base = new Base();
base.sayHi.call(bob);