Композиция, наследование и агрегация в JavaScript

В Интернете много информации о композиции и наследовании, но я не нашел достойных примеров на JavaScript. Используя приведенный ниже код для демонстрации наследования:

function Stock( /* object with stock names and prices */ ) {
    for (var company_name in arguments[0]) {
        // copy the passed object into the new object created by the constructor
        this[company_name] = arguments[0][company_name]; 
    }
}

// example methods in prototype, their implementation is probably redundant for
// this question, but list() returns an array with toString() invoked; total()
// adds up the stock prices and returns them. Using ES5 feature to make
// inherited properties non-enumerable 

Stock.prototype =  {
    list: function () {
        var company_list = [];
        for (var company_name in this)
            company_list.push(company_name);
        return company_list.toString();
    },
    total: function () {
        var price_total = 0;
        for (var company_name in this)
            price_total += this[company_name];
        return '$' + price_total;
    }
};

Object.defineProperties(Stock.prototype, {
    list: { enumerable: false },
    total: { enumerable:false }
});

var portfolio = new Stock({ MSFT: 25.96, YHOO: 16.13, AMZN: 173.10 });
portfolio.list();  // MSFT,YHOO,AMZN
portfolio.total(); // $215.19

(Чтобы сделать код меньше, можно опустить реализацию методов, например: Stock.total = function(){ /* код */ } Я просто вставил их туда, чтобы быть модным). Если композиция является предпочтительной для многих ситуаций в ООП, почему большинство людей, использующих JavaScript, похоже, используют только прототипы и наследование? Я не нашел в Интернете много информации о композиции в JavaScript, только в других языках.

Может ли кто-нибудь привести мне пример, используя приведенный выше код, чтобы продемонстрировать композицию и агрегацию?

57
задан Eric Leschinski 29 May 2015 в 16:03
поделиться