Heim  >  Artikel  >  Web-Frontend  >  Ausführliche Erläuterung des Beispielcodes des JavaScript-Kettenaufrufrechners

Ausführliche Erläuterung des Beispielcodes des JavaScript-Kettenaufrufrechners

黄舟
黄舟Original
2017-03-18 14:52:231972Durchsuche

Ein klassischer Kettensyntaxrechner würde so aussehen:

FluentCalculator.one.plus.two // 1 + 2 = 3
FluentCalculator.one.plus.two.plus.three.minus.one.minus.two.minus.four //  -1
FluentCalculator.one.plus.ten - 10 // 1 + 10 - 10 = 1

Bei einem abnormalen Aufruf wird undefiniert zurückgegeben:

FluentCalculator.one.one // undefined,因为值不能调用值
FluentCalculator.one.plus.plus // undefined,操作不能连续调用

Für dieses Problem müssen wir eine Idee haben festgestellt: Es gibt Zustände, die zwischen Aufrufen übergeben werden, und es gibt zwei Zustände.

Wenn der Aufruf des Werts (num) endet, wird der Operationsstatus Objekt (OprStatus) zurückgegeben.

Wenn der Aufruf der Operation (opr) endet, wird das Wertstatusobjekt (NumStatus) zurückgegeben.

Mit anderen Worten, diese beiden Zustände wechseln sich ab, wenn es keinen Wechsel gibt, wird es abnormal aufgerufen und undefiniert zurückgegeben.

"use strict";

var num = ["zero","one","two","three","four","five","six","seven","eight","nine","ten"];

var oprs = {plus : "+",minus : "-",times : "*",pidedBy : "/"};

var Magic = {};
//状态对象,父对象
function Status(value,opr){
	//当前运算结果
    this.value = value;
	//当前操作符
    this.opr = opr;
}
//值状态对象,继承状态对象
function NumStatus(value,opr){
    Status.call(this,value,opr);
}
//操作状态对象,继承状态对象
function OprStatus(value,opr){
    Status.call(this,value,opr);
}
//给值状态对象原型上绑定方法
for(let i=0;i<num.length;i++){
    Object.defineProperty(Magic,num[i],{
        get : function(){  
            var val;
            if(!this.opr){
                val = i;
            }
            else{              
                switch(this.opr){
                    case "+":val = this.value + i;break;
                    case "-":val = this.value - i;break;
                    case "*":val = this.value * i;break;
                    case "/":val = this.value / i;break;
                }
            }
			//返回操作状态对象
            return new OprStatus(val,null);
        }
    });
}
//给操作状态对象原型上绑定方法
for(let i in oprs){
    if(oprs.hasOwnProperty(i)){
        Object.defineProperty(OprStatus.prototype,i,{
            get : function(){
				//返回值状态对象
                return new NumStatus(this.value,oprs[i]);
            }
        });
    }
}

var FluentCalculator = Magic;

NumStatus.prototype = Magic;
//所有调用结束时,就会调valueOf打印,直接返回最终运算结果
OprStatus.prototype.valueOf = function(){
    return this.value;
};

Das obige ist der detaillierte Inhalt vonAusführliche Erläuterung des Beispielcodes des JavaScript-Kettenaufrufrechners. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn