我正在寻找一种简单的方法来创建两个类,一个继承自另一个类,子类重新定义父方法之一,并在新方法内调用父类.
例如,有一个类,Animal
并且Dog
,Animal类定义了一个makeSound()
确定如何输出声音的方法,然后Dog在其自己的makeSound()
方法中覆盖以产生"低音"声音,但同时也调用Animal makeSound()
来输出那个低音.
我在这里查看了John Resig的模型,但它使用了arguments.callee
ECMA脚本中明显折旧的本机属性.这是否意味着我不应该使用John Resig的代码?
使用Javascript的原型继承模型编写动物/狗代码的简洁方法是什么?
我一直在阅读很多关于javascript中"继承"的文章.其中一些使用,new
而其他人推荐Object.Create
.我读的越多,我就越困惑,因为它似乎存在无穷无尽的变体来解决继承问题.
有人可以向我展示最受欢迎的方式(如果有的话,还是事实上的标准)?
(我想有一个基础物体Model
,我可以延伸RestModel
或LocalStorageModel
).
我已经设置了一个基类作为标准:
MyBase = function() {
this.m_Stuff = 0; // etc
};
MyBase.prototype.MySuperFunction = function (arg1) {
alert("Hello" + arg1);
};
Run Code Online (Sandbox Code Playgroud)
接下来,我设置了另一个继承MyBase的类
MyChild = function () {
MyBase.call(this);
this.m_OtherStuff = 1; // etc
};
MyChild.prototype = new MyBase(); // innherit
Run Code Online (Sandbox Code Playgroud)
但那时(这是我不知道该怎么做)我想用更好的一个覆盖MyBase的MySuperFunction,但是在这个过程中调用基类函数:
MyChild.prototype.MySuperFunction = function (arg1, arg2) {
MyBase.MySuperFunction(arg1); // THIS LINE IS THE LINE I DONT KNOW HOW TO DO
alert("You is a " + arg2 + "'th level idiot");
};
Run Code Online (Sandbox Code Playgroud)
它想要覆盖的子类是基类函数,但是想要在新的改进定义中调用基类函数.
这是可能的,如果是的话,怎么办呢?
在风格上,我更喜欢这种结构:
var Filter = function( category, value ){
this.category = category;
this.value = value;
// product is a JSON object
Filter.prototype.checkProduct = function( product ){
// run some checks
return is_match;
}
};
Run Code Online (Sandbox Code Playgroud)
对于这种结构:
var Filter = function( category, value ){
this.category = category;
this.value = value;
};// var Filter = function(){...}
Filter.prototype.checkProduct = function( product ){
// run some checks
return is_match;
}
Run Code Online (Sandbox Code Playgroud)
从功能上讲,以这种方式构造我的代码有什么缺点吗?将原型方法添加到构造函数体内的原型对象(即在构造函数的表达式语句关闭之前)会导致意外的范围问题吗?
我之前已经成功使用了第一个结构,但是我想确保自己没有为调试带来麻烦,或者由于编码错误导致开发人员悲痛和恶化.