最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

comparison - Compare the classes of 2 separate JavaScript objects - Stack Overflow

programmeradmin3浏览0评论

I want to pare the classes of 2 JavaScript objects. The current call below fails. The idea here is to deal extract the correct cross-rate using the passed-in "from and to" variables.

Thanks for the help!

UPDATED: The Working Code Now Looks Like This:

<script type="text/javascript">
<!--
    // ------------------------
    // CLASS
    function Currency(clientId, country, code, imageURL, name) {

        this.clientId = clientId            //EXAMPLE: txtBudget
        this.country = country;             //EXAMPLE: America
        this.code = code;                   //EXAMPLE: USD
        this.imageURL = imageURL;           //EXAMPLE: "http://someplace/mySymbol.gif"
        this.name = name;                   //EXAMPLE: Dollar
        this.amount = parseFloat("0.00");   //EXAMPLE: 100
    };
    Currency.prototype.convertFrom = function (currency, factor) {
        this.amount = currency.amount * factor;
    }

    // CLASS
    function Pound(clientId, imageURL) {
        Currency.call(this, clientId, "Greate Britain", "GBP", imageURL, "Pound");
    };
    Pound.prototype = new Currency();
    Pound.prototype.constructor = Pound;

    // CLASS
    function Dollar(clientId, imageURL) {
        Currency.call(this, clientId, "America", "USD", imageURL, "Dollar");
    };
    Dollar.prototype = new Currency();
    Dollar.prototype.constructor = Dollar;

    // CLASS
    function Reais(clientId, imageURL) {
        Currency.call(this, clientId, "Brazil", "BRL", imageURL, "Reais");
    };
    Reais.prototype = new Currency();
    Reais.prototype.constructor = Reais;

    // ------------------------
    // CLASS
    function Suscriber(element) {
        this.element = element;
    };
    // CLASS
    function Publisher() {
        this.subscribers = new Array();
        this.currencyCrossRates = new Array();
    };
    Publisher.prototype.findCrossRate = function (from, to) {
        var crossRate = null;
        for (var i = 0; i < this.currencyCrossRates.length; i++) {
            if ((this.currencyCrossRates[i].from.constructor === from.constructor) && (this.currencyCrossRates[i].to.constructor === to.constructor))
                crossRate = this.currencyCrossRates[i];
        }
        return crossRate;
    }

    // ------------------------
    // CLASS
    function CurrencyCrossRate(from, to, rate) {
        this.from = from;
        this.to = to;
        this.rate = parseFloat(rate);
    };

    jQuery(document).ready(function () {

        var dollar = new Dollar(null, null);
        var reais = new Reais(null, null);

        var dollarToReais = new CurrencyCrossRate(dollar, reais, 0.8);
        var reaisToDollar = new CurrencyCrossRate(reais, dollar, 1.2);

        publisher = new Publisher();
        publisher.currencyCrossRates.push(dollarToReais);
        publisher.currencyCrossRates.push(reaisToDollar);

        // SETUP
        jQuery(".currency").each(function () {
            publisher.subscribers.push(new Suscriber(this));
        });

        var newDollar = new Dollar(null, null);
        var newReais = new Reais(null, null);

        // This now resolves correctly
        var first = crossRate = publisher.findCrossRate(newDollar, newReais);
        var second = crossRate = publisher.findCrossRate(newReais, newDollar);
    });
-->
</script>

I want to pare the classes of 2 JavaScript objects. The current call below fails. The idea here is to deal extract the correct cross-rate using the passed-in "from and to" variables.

Thanks for the help!

UPDATED: The Working Code Now Looks Like This:

<script type="text/javascript">
<!--
    // ------------------------
    // CLASS
    function Currency(clientId, country, code, imageURL, name) {

        this.clientId = clientId            //EXAMPLE: txtBudget
        this.country = country;             //EXAMPLE: America
        this.code = code;                   //EXAMPLE: USD
        this.imageURL = imageURL;           //EXAMPLE: "http://someplace/mySymbol.gif"
        this.name = name;                   //EXAMPLE: Dollar
        this.amount = parseFloat("0.00");   //EXAMPLE: 100
    };
    Currency.prototype.convertFrom = function (currency, factor) {
        this.amount = currency.amount * factor;
    }

    // CLASS
    function Pound(clientId, imageURL) {
        Currency.call(this, clientId, "Greate Britain", "GBP", imageURL, "Pound");
    };
    Pound.prototype = new Currency();
    Pound.prototype.constructor = Pound;

    // CLASS
    function Dollar(clientId, imageURL) {
        Currency.call(this, clientId, "America", "USD", imageURL, "Dollar");
    };
    Dollar.prototype = new Currency();
    Dollar.prototype.constructor = Dollar;

    // CLASS
    function Reais(clientId, imageURL) {
        Currency.call(this, clientId, "Brazil", "BRL", imageURL, "Reais");
    };
    Reais.prototype = new Currency();
    Reais.prototype.constructor = Reais;

    // ------------------------
    // CLASS
    function Suscriber(element) {
        this.element = element;
    };
    // CLASS
    function Publisher() {
        this.subscribers = new Array();
        this.currencyCrossRates = new Array();
    };
    Publisher.prototype.findCrossRate = function (from, to) {
        var crossRate = null;
        for (var i = 0; i < this.currencyCrossRates.length; i++) {
            if ((this.currencyCrossRates[i].from.constructor === from.constructor) && (this.currencyCrossRates[i].to.constructor === to.constructor))
                crossRate = this.currencyCrossRates[i];
        }
        return crossRate;
    }

    // ------------------------
    // CLASS
    function CurrencyCrossRate(from, to, rate) {
        this.from = from;
        this.to = to;
        this.rate = parseFloat(rate);
    };

    jQuery(document).ready(function () {

        var dollar = new Dollar(null, null);
        var reais = new Reais(null, null);

        var dollarToReais = new CurrencyCrossRate(dollar, reais, 0.8);
        var reaisToDollar = new CurrencyCrossRate(reais, dollar, 1.2);

        publisher = new Publisher();
        publisher.currencyCrossRates.push(dollarToReais);
        publisher.currencyCrossRates.push(reaisToDollar);

        // SETUP
        jQuery(".currency").each(function () {
            publisher.subscribers.push(new Suscriber(this));
        });

        var newDollar = new Dollar(null, null);
        var newReais = new Reais(null, null);

        // This now resolves correctly
        var first = crossRate = publisher.findCrossRate(newDollar, newReais);
        var second = crossRate = publisher.findCrossRate(newReais, newDollar);
    });
-->
</script>
Share edited Aug 9, 2018 at 11:52 Prisoner ZERO asked Aug 1, 2011 at 19:08 Prisoner ZEROPrisoner ZERO 14.2k21 gold badges101 silver badges147 bronze badges 8
  • instanceof should work. What do you mean by pare? – Alex Turpin Commented Aug 1, 2011 at 19:12
  • I mean to pare the crossRate.from instance to the passed-in instance. – Prisoner ZERO Commented Aug 1, 2011 at 19:15
  • 1 Try changing prototype to constructor in your parisons – Joe Commented Aug 1, 2011 at 19:16
  • Ah ok. Joey is right, you need to do from instanceof rates[i].from.constructor – Alex Turpin Commented Aug 1, 2011 at 19:22
  • UPDATED! It still fails so I posted the whole thing. Thanks for the help. – Prisoner ZERO Commented Aug 1, 2011 at 19:27
 |  Show 3 more ments

1 Answer 1

Reset to default 4

The right hand side operator of instanceof should not be the prototype object, but instead the object's constructor function, accessible through the constructor property of the object in question. Since this property in fact references the function which was used to construct the object, parison is done with the usual equality operator:

this.currencyCrossRates[i].from.constructor == from.constructor

EDIT:

  1. Remove the lines Pound.prototype.constructor = Pound(); etc (one for each currency). The constructor property is a built-in feature which automatically references the correct function. However, it is unfortunately writable and so can be reassigned - don't do it!

  2. The conditions should be of the form this.currencyCrossRates[i].from instanceof from.constructor - the left operand is the Object and the right one is the constructor function.

发布评论

评论列表(0)

  1. 暂无评论