Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript:使用继承;原样;_Javascript_Oop_Inheritance - Fatal编程技术网

javascript:使用继承;原样;

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&

我想在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>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]);}