Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/451.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

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_Multiple Inheritance_Prototypal Inheritance - Fatal编程技术网

来自多个对象的javascript继承

来自多个对象的javascript继承,javascript,oop,multiple-inheritance,prototypal-inheritance,Javascript,Oop,Multiple Inheritance,Prototypal Inheritance,我不太熟悉javascript继承,我试图让一个对象从另一个对象继承,并定义它自己的方法: function Foo() {} Foo.prototype = { getColor: function () {return this.color;}, }; function FooB() {} FooB.prototype = new Foo(); FooB.prototype = { /* other methods here */ }; var x = new FooB()

我不太熟悉javascript继承,我试图让一个对象从另一个对象继承,并定义它自己的方法:

function Foo() {}
Foo.prototype = {
    getColor: function () {return this.color;},
};
function FooB() {}
FooB.prototype = new Foo();
FooB.prototype = {
    /* other methods here */
};

var x = new FooB().getColor();
但是,第二个将覆盖第一个(
FooB.prototype=new Foo()被取消)。有没有办法解决这个问题,还是我走错了方向

提前感谢,对于任何不好的术语,我深表歉意。

一个解决方案是:

function FooB() {}
var p = new Foo();
p.methodA = function(){...}
p.methodB = function(){...}
p.methodC = function(){...}
...

FooB.prototype = p;
更新:关于使用现有对象展开。始终可以将一个对象的现有特性复制到另一个对象:

FooB.prototype = new Foo();
var proto = {
     /*...*/
};

for(var prop in proto) {
    FooB.prototype[prop] = proto[prop];
}
只要
proto
是一个“普通”对象(即不从另一个对象继承),就可以了。否则,您可能需要添加
if(proto.hasOwnProperty(prop))
以仅添加非继承属性。

一种解决方案是:

function FooB() {}
var p = new Foo();
p.methodA = function(){...}
p.methodB = function(){...}
p.methodC = function(){...}
...

FooB.prototype = p;
更新:关于使用现有对象展开。始终可以将一个对象的现有特性复制到另一个对象:

FooB.prototype = new Foo();
var proto = {
     /*...*/
};

for(var prop in proto) {
    FooB.prototype[prop] = proto[prop];
}

只要
proto
是一个“普通”对象(即不从另一个对象继承),就可以了。否则,您可能需要添加
if(proto.hasOwnProperty(prop))
以仅添加非继承属性。

每个对象只能有一个原型,因此如果您希望在继承(复制)原型后添加到原型,您必须扩展它,而不是分配新原型。例如:

function Foo() {}

Foo.prototype = {
    x: function(){ alert('x'); },
    y: function(){ alert('y'); }
};

function Foo2() {}

Foo2.prototype = new Foo();
Foo2.prototype.z = function() { alert('z'); };

var a = new Foo();
a.x();
a.y();
var b = new Foo2();
b.x();
b.y();
b.z();

每个对象只能有一个原型,因此,如果要在继承(复制)原型后将其添加到原型中,则必须将其展开,而不是指定新的原型。例如:

function Foo() {}

Foo.prototype = {
    x: function(){ alert('x'); },
    y: function(){ alert('y'); }
};

function Foo2() {}

Foo2.prototype = new Foo();
Foo2.prototype.z = function() { alert('z'); };

var a = new Foo();
a.x();
a.y();
var b = new Foo2();
b.x();
b.y();
b.z();

可以使用
extend
函数将新成员复制到原型对象

function FooB() {}
FooB.prototype = new FooA();

extend(FooB.prototype, {
    /* other methods here */
});
扩展

/**
 * Copies members from an object to another object.
 * @param {Object} target the object to be copied onto
 * @param {Object} source the object to copy from
 * @param {Boolean} deep  whether the copy is deep or shallow
 */
function extend(target, source, deep) {
    for (var i in source) {
        if (deep || Object.hasOwnProperty.call(source, i)) {
            target[i] = source[i];
        }
    }
    return target;
}

可以使用
extend
函数将新成员复制到原型对象

function FooB() {}
FooB.prototype = new FooA();

extend(FooB.prototype, {
    /* other methods here */
});
扩展

/**
 * Copies members from an object to another object.
 * @param {Object} target the object to be copied onto
 * @param {Object} source the object to copy from
 * @param {Boolean} deep  whether the copy is deep or shallow
 */
function extend(target, source, deep) {
    for (var i in source) {
        if (deep || Object.hasOwnProperty.call(source, i)) {
            target[i] = source[i];
        }
    }
    return target;
}

没有办法用另一个对象扩展原型而不覆盖它吗?@digitalFresh:没有,没有办法连接对象,因此必须将每个属性从一个对象复制到另一个对象。然而,这可以通过一个循环来完成。例如,
jQuery.extend
方法就是这样做的。@digitalFresh-当然可以像@Guffa写的那样进行扩展。有关更多详细信息,请参见我的答案(不使用jQuery)。没有办法用另一个对象扩展原型而不覆盖它吗?@digitalFresh:没有,没有办法连接对象,因此必须将每个属性从一个对象复制到另一个对象。然而,这可以通过一个循环来完成。例如,
jQuery.extend
方法就是这样做的。@digitalFresh-当然可以像@Guffa写的那样进行扩展。有关更多详细信息,请参见我的答案(不使用jQuery)。
proto
可以是“普通”对象,但如果第三方脚本扩展了
对象。prototype
最终会将这些值复制到
FooB。prototype
proto
可以是“普通”对象,但是如果第三方脚本增加了
Object.prototype
,那么最终会将这些值复制到
FooB.prototype