js策略模式的疑惑-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

js策略模式的疑惑

2016-05-27 08:14:34 1689 1
    var performanceS=function(){};
                performanceS.prototype.calculate=function(salary){
                    return salary*4;
                }
                var performanceA=function(){};
                performanceA.prototype.calculate=function(salary){
                    return salary*3;
                }
                var performanceB=function(){};
                performanceB.prototype.calculate=function(salary){
                    return salary*2;
                }
                
                var Bonus=function(){
                    this.salary=null;
                    this.strategy=null;
                };
                Bonus.prototype.setSalary=function(salary){
                    this.salary=salary;
                }
                Bonus.prototype.setStrategy=function(strategy){
                    this.strategy=strategy;
                }
                Bonus.prototype.getBonus=function(){
                    //这里的calculate是另外三个对象原型下的方法这为什么不报错,是怎么实现的
                    return this.strategy.calculate(this.salary);
                }
                
                var bonus=new Bonus();
                bonus.setSalary(10000);
                bonus.setStrategy(new performanceS());
                console.log(bonus.getBonus());//40000
                bonus.setStrategy(new performanceA());
取消 提交回答
全部回答(1)
  • 小旋风柴进
    2019-07-17 19:16:51

    简单直白一点儿就是,这就是 js 用类创建对象的方式,可以把 performance 看成是类名,然后 new performace 就是这个类生成的对象。

    var a = new performance,具体细节(简化的)是:

    创建一个对象,`obj
    obj.[[prototype]] = perfomance.prototype; `// 这个属性原本不可以用 js 访问,后来 w3c 把它添加到了标准中,后来使用了新的接口所以又去掉了,但是在 firefox 和 chrome 实现也保留了这个属性叫做 __proto__,你可以在他们的调试窗口看到。
    令this = obj,然后执行 perfomance中定义的代码;
    假设上一步perfomamce的返回值是'ret'。 如果 ret是对象,那么 a = ret, 否则 a = obj;
    然后就是访问 a 的属性(读取,先不谈写入)的时候,给出一个属性,calculate,首先看 a.calculate 是否存在,如果不存在就试图访问 a.[[prototype]].calculate,如果还不存在就访问a.[[prototype]].calculate。。。。

    这就是 js 的原型链,自己百度找其他参考资料(为什么有人一次又一次的问这个问题)

    所以你的代码就是
    a.calculate 就是 a.[[prototype]].calculate 也就是 perfomance.prototype.calculate

    0 0
相关问答

11

回答

在阿里云上安装和运行Node.js全功略

ycwong 2013-09-18 15:17:30 64426浏览量 回答数 11

19

回答

【分享】如何提高网站的打开速度?

enj0y 2012-11-17 14:35:22 57007浏览量 回答数 19

145

回答

【新手入门】云服务器linux使用手册

fanyue88888 2012-11-26 17:14:18 157754浏览量 回答数 145

28

回答

钉钉开放平台“常见问题常见问题常见问题“重要请关注

竹梅 2015-12-03 00:39:14 93852浏览量 回答数 28

22

回答

爬虫数据管理【问答合集】

我是管理员 2018-08-10 16:37:41 147278浏览量 回答数 22

31

回答

[@倚贤][¥20]刚学完html/css/js的新手学习servlet、jsp需要注意哪些问题?

弗洛伊德6 2018-10-27 21:52:43 146072浏览量 回答数 31

23

回答

【云服务器分享】网站访问速度快才是硬道理

dreamdoo 2012-10-15 10:15:02 85390浏览量 回答数 23

13

回答

【云服务器分享】如何节省网站流量

dreamdoo 2012-10-15 10:36:09 80489浏览量 回答数 13

15

回答

对象存储oss【问答合集】

我是管理员 2018-08-03 14:54:02 67772浏览量 回答数 15

3

回答

Nginx—owncloud安装记事

寒喵 2014-06-07 23:24:41 48754浏览量 回答数 3
2736
文章
6591
问答
问答排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载