JavaScript наследуется от двух разных объектов [дубликат]

У меня есть другая перспектива ответить на это.

При работе на разных уровнях, например, в приложении MVC, контроллеру нужны службы для вызова бизнес-операций. В таких сценариях контейнер инжекции зависимостей может использоваться для инициализации служб, чтобы исключить исключение NullReferenceException. Это означает, что вам не нужно беспокоиться о проверке нулевого значения и просто вызвать службы с контроллера, как будто они всегда будут доступны (и инициализированы) как одиночный или прототип.

public class MyController
{
    private ServiceA serviceA;
    private ServiceB serviceB;

    public MyController(ServiceA serviceA, ServiceB serviceB)
    {
        this.serviceA = serviceA;
        this.serviceB = serviceB;
    }

    public void MyMethod()
    {
        // We don't need to check null because the dependency injection container 
        // injects it, provided you took care of bootstrapping it.
        var someObject = serviceA.DoThis();
    }
}
1
задан tcooc 20 January 2011 в 12:18
поделиться

3 ответа

У каждого объекта может быть только один прототип, поэтому, если вы хотите добавить к прототипу после наследования (копирования) его, вам нужно расширить его вместо назначения нового прототипа. Пример:

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();
5
ответ дан Guffa 25 August 2018 в 20:21
поделиться

Одним из решений было бы:

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)) только для добавления не унаследованных свойств.

2
ответ дан Felix Kling 25 August 2018 в 20:21
поделиться

Вы можете использовать функцию extend, которая копирует новые элементы в объект прототипа.

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

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

extend

/**
 * 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;
}
2
ответ дан galambalazs 25 August 2018 в 20:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: