我正在尝试编写一个从父类扩展的javascript类,重载一个方法并稍微改变它。
例如,它检查一些变量,如果它们设置为true,则它在父项上执行相同的方法,否则它会执行一些不同的代码。
这就是我想出来的:
function Dad(name)
{
this.yell = function()
{
console.log( 'GRRRRRRR ' + name);
}
}
function Kid(name, age)
{
var parent = new Dad(name);
parent.yell = function()
{
if (age < 15)
console.log( 'BAAAAA ' + name );
else
parent.yell(); //This is the problem line, how to call this method on
//parent object
}
return parent;
}
var k = new Kid('bob', 13);
k.yell();
但问题是,如何在父对象上调用该方法。
有什么想法吗?
答案 0 :(得分:2)
使用原型。它们允许您访问超类的方法,但不需要实例化它。
然后,从子类中,您可以执行SuperClass.prototype.instanceMethod.call(this)
,这在大多数典型的OO语言中基本上是super
,但JS并不能帮助您弄清楚超类是什么。所以你必须自己跟踪它。
// Superclass
function Dad() {};
Dad.prototype.yell = function() {
console.log("Do your homework!");
}
// Subclass
function Kid(age) {
// calls the constructor of the superclass.
// in this case, the Dad() constructor does nothing, so it's not required here.
Dad.call(this);
// save constructor argument into this instance.
this.age = age;
};
// Inheritance happens here, prototype is an instance of superclass
Kid.prototype = new Dad();
// Make sure the constructor is properly assigned.
Kid.prototype.constructor = Kid;
// Override an instance method.
Kid.prototype.yell = function() {
if (this.age < 18) {
console.log('Waaaaa, I hate homework');
} else {
// calls the yell method of the superclass
Dad.prototype.yell.call(this);
}
}
// make a kid.
var k = new Kid(13);
k.yell(); // 'Waaaaa, I hate homework'
// make an old kid.
var k = new Kid(30);
k.yell(); // 'Do your homework!'
JS中的OO继承可能很麻烦,但有一些东西需要帮助。
仅举几例。