猿问

在JavaScript中重载算术运算符?

在JavaScript中重载算术运算符?

考虑到这个JavaScript“类”定义,这是我能想到的最好的方法来解决这个问题:

var Quota = function(hours, minutes, seconds){
    if (arguments.length === 3) {
        this.hours = hours;
        this.minutes = minutes;
        this.seconds = seconds;

        this.totalMilliseconds = Math.floor((hours * 3600000)) + Math.floor((minutes * 60000)) + Math.floor((seconds * 1000));
    }
    else if (arguments.length === 1) {
        this.totalMilliseconds = hours;

        this.hours = Math.floor(this.totalMilliseconds / 3600000);
        this.minutes = Math.floor((this.totalMilliseconds % 3600000) / 60000);
        this.seconds = Math.floor(((this.totalMilliseconds % 3600000) % 60000) / 1000);
    }

    this.padL = function(val){
        return (val.toString().length === 1) ? "0" + val : val;
    };

    this.toString = function(){
        return this.padL(this.hours) + ":" + this.padL(this.minutes) + ":" + this.padL(this.seconds);
    };

    this.valueOf = function(){
        return this.totalMilliseconds;
    };};

以及以下测试设置代码:

var q1 = new Quota(23, 58, 50);var q2 = new Quota(0, 1, 0);var q3 = new Quota(0, 0, 10);console.log("Quota 01 is " + q1.toString());    // Prints "Quota 01 is 23:58:50"console.log("Quota 02 is " + q2.toString());    // Prints "Quota 02 is 00:01:00"console.log("Quota 03 is " + q3.toString());    // Prints "Quota 03 is 00:00:10"

是否有隐式创建的任何方式q4Quota使用加法运算符如下对象...

var q4 = q1 + q2 + q3;console.log("Quota 04 is " + q4.toString());    // Prints "Quota 04 is 86400000"

而不是诉诸......

var q4 = new Quota(q1 + q2 + q3);console.log("Quota 04 is " + q4.toString());    // Prints "Quota 04 is 24:00:00"

如果不是这个领域的最佳实践建议是什么,可以通过算术运算符组合自定义数字JavaScript对象?


哈士奇WWW
浏览 825回答 3
3回答

九州编程

由于每个人都投了我的另一个答案,我想发布概念代码的证明,其实际上按预期工作。这已在chrome和IE中测试过。//Operator Overloadingvar myClass = function () {//Privatesvar intValue = Number(0),     stringValue = String('');//Publicsthis.valueOf = function () {     if (this instanceof myClass) return intValue;     return stringValue;}this.cast = function (type, call) {     if (!type) return;     if (!call) return type.bind(this);     return call.bind(new type(this)).call(this);}}//Derived classvar anotherClass = function () {//Store the base referencethis.constructor = myClass.apply(this);var myString = 'Test',     myInt = 1;this.valueOf = function () {     if (this instanceof myClass) return myInt;     return myString;}}//Testsvar test = new myClass(),anotherTest = new anotherClass(),composed = test + anotherTest,yaComposed = test.cast(Number, function () {     return this + anotherTest}),yaCComposed = anotherTest.cast(Number, function () {     return this + test;}),t = test.cast(anotherClass, function () {     return this + anotherTest}),tt = anotherTest.cast(myClass, function () {     return this + test;});debugger;如果有人愿意提供技术解释为什么这不够好我会很高兴听到它!

犯罪嫌疑人X

据我所知,Javascript(至少现在存在)不支持运算符重载。我能建议的最好的方法是从其他几个方法制作新的配额对象的类方法。这是我的意思的一个简单例子:// define an example "class"var NumClass = function(value){&nbsp; &nbsp; this.value = value;}NumClass.prototype.toInteger = function(){&nbsp; &nbsp; return this.value;}// Add a static method that creates a new object from several othersNumClass.createFromObjects = function(){&nbsp; &nbsp; var newValue = 0;&nbsp; &nbsp; for (var i=0; i<arguments.length; i++){&nbsp; &nbsp; &nbsp; &nbsp; newValue += arguments[i].toInteger();&nbsp; &nbsp; }&nbsp; &nbsp; return new this(newValue)}并使用它像:var n1 = new NumClass(1);var n2 = new NumClass(2);var n3 = new NumClass(3);var combined = NumClass.createFromObjects(n1, n2, n3);
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答