JS中的圣杯模式

点击去原文

圣杯模式是Javascript中用来实现继承的一种方法,它的简单形式如下所示


    function Father(){}
    function Son(){}
    Father.prototype.lastName=‘Jack‘;

    //圣杯模式
    function inherit(Target,Origin){
        function F(){};
        F.prototype=Origin.prototype;
        Target.prototype=new F();
    }

    inherit(Son,Father);
    var son=new Son();
    var father=new Father(); 

    Son.prototype.sex=‘male‘;
    console.log(son.lastName);//Jack
    console.log(son.sex);//male
    console.log(father.sex);//undefined

这种圣杯模式的本质在于,中间生成了一个对象,起到了隔离的作用,今后为Son.prototype添加属性时,全部都会加在这个对象里面,所以不会对父级产生影响。而向上查找是沿着__proto__查找,可以顺利查找到父级的属性,实现继承。

下面来具体分析是如何进行继承的

首先inherit 函数中定义了一个function F ,F用来充当中间层的函数

之后F.prototype=Origin.prototype; 这一步表示,让F和Father的prototype指向同一地址,即Father.prototype

下一步Target.prototype=new F(); 表示,通过函数F生成一个对象(这里把这个对象成为objF),让Son函数的prototype指向这个对象objF,到这一步实际上就已经实现了继承。

下方代码中,生成了son和father对象之后,对函数Son的prototype增加了一个sex属性,而Son函数的prototype是指向对象objF的,因此这个sex属性会加到objF之上,因此下方打印son.sex时就会出现male。

而对于son.lastName而言,首先查找Son函数内部是否有lastName属性,很明显没有。因此就沿着__proto__(即原型链)往上找, 即在函数F中找是否存在该属性,之前提到了F和Father的prototype都是指向Father.prototype的,而在Father.prototype中存在该属性,因此son.lastName的打印结果为Jack。

最后,由于有中间层F的存在,因此Father的prototype自始至终都没有受到影响,所以father.sex的打印结果为undefined。

一般在使用圣杯模式时还会加上另外两句话


Target.prototype.constructor=Target;
//由于Target.prototype指向的是objF,因此并没有constructor这一属性,沿着__proto__向上查找,发现constructor指向的是Father,
因此这里可以进行归位,让它的constructor重新指向它自己 Target.prototype.uber=Origin.prototype; //uber是超类的意思,这里主要用来储存这个目标到底继承自谁,可写可不写

此外,还有另外一种写法,利用闭包将F作为一个私有化变量,完整代码如下:


//方法1
    function Father(){}
    function Son(){}
    Father.prototype.lastName=‘Jack‘;
    function inherit(Target,Origin){
        function F(){};
        F.prototype=Origin.prototype;
        Target.prototype=new F();
        Target.prototype.constructor=Target;
        Target.prototype.uber=Origin.prototype;
    }
    inherit(Son,Father);
    var son=new Son();
    var father=new Father(); 
    Son.prototype.sex=‘male‘;
    console.log(son.lastName);//Jack
    console.log(son.sex);//male
    console.log(father.sex);//undefined
方法2,利用闭包将F作为一个私有化变量
    var inherit=(function(){
        var F=function F(){};
        return function(){
            F.prototype=Origin.prototype;
            Target.prototype=new F();
            Target.prototype.constructor=Target;
            Target.prototype.uber=Origin.prototype;
        }
    })();
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 圣杯马丁是一种交易策略,基于投资人的总资产,确定每个交易周期的投资金额,以实现最大化回报的目标。以下是用 JavaScript 实现圣杯马丁交易策略的代码: ```javascript // 初始化总资产、单笔交易投资比例、当前投资比例 let totalAssets = 10000; // 假设总资产为 10000 元 const investRatio = 0.02; // 假设单笔交易投资比例为 2% let currentRatio = investRatio; // 初始投资比例为单笔交易投资比例 // 定义交易函数 function trade(price, isBuy) { // 根据当前投资比例计算交易金额 const amount = totalAssets * currentRatio; // 判断是买入还是卖出,计算交易后总资产 if (isBuy) { totalAssets -= amount; totalAssets += amount / price; } else { totalAssets += amount; totalAssets -= amount * price; } // 根据交易后总资产重新计算投资比例 currentRatio = investRatio * (totalAssets / 10000); } // 调用交易函数进行模拟交易,假设价格在不同时间点分别为 10 元、12 元、8 元、14 元、6 元 trade(10, true); // 买入 200 元 trade(12, true); // 买入 205.71 元 trade(8, false); // 卖出 211.43 元 trade(14, true); // 买入 187.84 元 trade(6, false); // 卖出 200 元 console.log(totalAssets); // 输出最终的总资产 ``` 这个代码模拟了 5 个交易周期,每个周期的价格不同。在每个交易周期,根据当前的投资比例计算投资金额,然后根据买入或卖出的情况计算交易后的总资产。在每个交易周期结束后,根据当前的总资产重新计算投资比例。最终输出的是经过多次交易后的总资产。 ### 回答2: 圣杯马丁交易策略是一种基于数学计算模型的交易策略,旨在帮助投资者在金融市场实现稳定的盈利。以下是使用JS编写的简单实现: ```javascript // 设置初始资金 let capital = 10000; // 设置初始股价 let stockPrice = 10; // 设置初始仓位比例 let position = 0.1; // 设置初始购买股票数量 let quantity = capital * position / stockPrice; function martinTradingStrategy(price) { // 计算当前股票市值 let marketValue = price * quantity; // 计算当前对账余额 let balance = capital - marketValue; // 判断是否购买股票 if (price < stockPrice && balance > 0) { let purchaseQuantity = balance / price; quantity += purchaseQuantity; capital -= balance; console.log("购买", purchaseQuantity, "股票"); } // 判断是否卖出股票 if (price > stockPrice && marketValue > capital) { let sellingQuantity = marketValue / price; quantity -= sellingQuantity; capital += marketValue; console.log("卖出", sellingQuantity, "股票"); } // 更新股价 stockPrice = price; } // 模拟一段时间内股票价格变化 let priceArray = [12, 14, 9, 15, 17, 13, 10, 11]; for (let i = 0; i < priceArray.length; i++) { martinTradingStrategy(priceArray[i]); } console.log("交易完毕,最终资产", capital + stockPrice * quantity); ``` 上述代码定义了一个简单的圣杯马丁交易策略函数`martinTradingStrategy`,该函数接收当前股票价格作为参数,并根据当前股价和设定的仓位比例判断是否购买或卖出股票。通过模拟一段时间内股票价格变化,我们可以得到最后的资产情况。 请注意这只是一个简单的实现示例,实际的交易策略需要考虑更多的因素,如手续费、市场走势分析等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值