javascript:使用继承;原样;
我想在Javascript中使用一些非常简单的继承,而不使用任何库(jQuery、Prototype等),我忘记了如何做到这一点 我知道如何创建简单的非继承对象:javascript:使用继承;原样;,javascript,oop,inheritance,Javascript,Oop,Inheritance,我想在Javascript中使用一些非常简单的继承,而不使用任何库(jQuery、Prototype等),我忘记了如何做到这一点 我知道如何创建简单的非继承对象: function Foo(x) { this.x = x; } Foo.prototype = { inc: function() { return this.x++; } } 然后我可以按如下方式使用: js>f1=new Foo(0) [object Object] js>f1.inc() 0 js&
function Foo(x)
{
this.x = x;
}
Foo.prototype = {
inc: function() { return this.x++; }
}
然后我可以按如下方式使用:
js>f1=new Foo(0)
[object Object]
js>f1.inc()
0
js>f1.inc()
1
js>f1.inc()
2
但是我如何添加一个子类和一个继承Foo“inc”方法的附加方法,而不改变Foo类
function Bar(x)
{
this.x = x;
}
Bar.prototype = new Foo();
Bar.prototype.pow = function(y) { return this.x+"^"+y+"="+Math.pow(this.x,y); }
这似乎是对的,除了构造器的这种古怪;我必须调用一次Foo构造函数来创建Bar原型,当调用Bar的构造函数时,似乎无法调用Foo构造函数
Bar.prototype = Object.create(Foo.prototype);
有什么建议吗?您可以使用此代码。它与您所做的完全相同,这是我知道的唯一继承方法,但此函数使用ECMAScritp 5中新增的
创建,如果可用,并执行一些额外的检查:
function inherit(p) {
if (p == null) throw TypeError(); // p must be non-null
if (Object.create) // If Object.create() is defined (ECMAScript 5 way)
return Object.create(p); // use it
var t = typeof p; // If not, do some more checking (the old way)
if (t !== "object" && t !== "function") throw TypeError();
function f() {}; // Define constructor
f.prototype = p; // Set prototype to p.
return new f(); // call constructor f() to create an "heir" of p
}
诀窍是使用而不是执行newfoo()
。它还将创建一个从Foo.prototype继承的新对象,但不调用Foo构造函数
Bar.prototype = Object.create(Foo.prototype);
虽然Object.create可能未在较旧的浏览器上定义,但如果需要,您可以自己定义它。(以下代码来自MDN链接)
在这种情况下,我倾向于将“构造函数代码”移动到init
函数。当然,您可以在以前的构造函数上使用apply
(使用新的Bar
对象作为上下文)以及模拟base()
(C#)或super()
(Java)。像这样?它似乎不起作用<代码>功能条(x){this.constructor.prototype.constructor.apply(this[x]);}