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!