浅谈js的几种模式(三)

摘要:
然后是前两个,最后是第三个,天真而冷酷。前面提到的构造函数模式和原型模式的结合是为了解决不共享的问题。然而,由于原型模式的共享,这也带来了一些问题。示例:functionPerson{this.sex=sex;}Person。原型name=“DJL”;Person.protype.job=“学生”;Varperson1=新人(“男性”);Varperson2=newPerson(“女性”);警报;//男性警报//学生警报;//女性警报//学生的组合方法是创建自定义类型最常用的方法。对原型所做的更改可以立即反映在所有对象实例中。对于在此模式下创建的对象,还可以使用instanceof来确定其特定类型。

  接着前面两篇,终于到了第三篇了,天真冷。

  组合使用构造函数模式和原型模式

  前面讲到了js中的原型模式,是为了解决不共享的问题,然而也因为原型模式的共享性带来了一些问题。原型中所有的属性,对它的实例都是共享的,但是有时我们希望每个实例中能有自己私有的属性,那么此时我们就要组合使用构造函数模式和原型模式。例:

  

       function Person (sex) {
                this.sex=sex;
            }
            
            Person.prototype.name="DJL";
            Person.prototype.job="student";
            
            var person1=new Person("男");
            var person2=new Person("女");
            
            alert(person1.sex);//
            alert(person1.job);//student
            alert(person2.sex);//
            alert(person2.job);//student

  这种组合方式,是目前使用最广的一种创建自定义类型的方法。

  动态原型模式

  先来个例子

  

//动态原型模式
            function Person (name,job,age) {
                this.name=name;
                this.job=job;
                this.age=age;
               
                if(typeof this.sayName !="function"){
             Person.prototype.sayName
=function(){ alert(this.name); } } }

        var person1=new Person("djl","student",22);
        var person2=new Person("DJL","student",22);
        person1.sayName();  //djl
        person2.sayName();  //DJL

  在这里如果sayName不存在,则会在原型中添加。我们可以看到在执行person1.sayName();时进入了if条件语句,而在执行person2.sayName();并没有进入。这就避免了在创建很多实例对象时反复去添加同一个原型属性。这里对原型所做的修改,能够立即在所有对象实例中得到反映。对于这种模式创建的对象,还可以使用instanceof 判断其具体类型。

  

      alert(person1 instanceof Person);//true

  寄生构造模式

  

      function Person () {
                var o=new Object();
                o.name="djl";
                o.age=22;
                o.job="student";
                
                o.sayName=function(){
                    alert(this.name);
                }
                
                return o;
                
            }

  首先,返回的这个对象与构造函数或者与构造函数的原型都没有什么关系,所以不能依赖instanceof 来检测其具体类型。和工厂模式有一样的问题。

  好了就写这么多了,我能写的也只有这么多了。感觉就是在解决如何实现属性共享和解决属性共享带来的问题,即对象属性有时要做到共享,有时要做到独立,有时两者都要兼备啊!

  欢迎大家继续交流,如果有更多见解,不要不告诉我哦!最后还是向大家推荐一下这本书《JavaScript高级程序设计》。

  

免责声明:文章转载自《浅谈js的几种模式(三)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇jQuery中hover()的事件委托深兰科技Java实习面试(offer到手含面试经验及答案)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

web自动化测试第11步:切换窗口、frame、alert的新方法:switch_to包详解

在之前的三节里,我们分别对窗口切换(handle)、frame切换、弹窗(alert)切换做了详细的解释,但是我们在写代码的时候发现,这些方法都被编辑器划伤了一条横线,但是方法还是可以正常使用,只是目前的pycharm不推荐你继续这样使用了(有新的方法可以替代它),那如果我们不使用这些方法的话,我们该怎么去完成切换窗口、frame这些操作呢?所以我们来学习...

iOS 中的 HotFix 方案总结详解

相信HotFix大家应该都很熟悉了,今天主要对于最近调研的一些方案做一些总结。iOS中的HotFix方案大致可以分为四种: WaxPatch(Alibaba) Dynamic Framework(Apple) React Native(Facebook) JSPatch(Tencent) WaxPatch WaxPatch是一个通过Lua语言编写的iO...

JS实现“隐藏与显示”功能(多种方法)

1,通过按钮实现隐藏与显示: 这个是通过按钮点击实现的隐藏与显示,具体代码如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47...

js 千分位(分转元,万转元...)

functionprice(a){ var num =Number(a); if(!num){//等于0 return num+'.00'; }else{//不等于0 num = Math.round((num)*100)/10000; num = num.toFixed(2);...

【cocos2d-js官方文档】二十四、如何在android平台上使用js直接调用Java方法

在cocos2d-js 3.0beta中加入了一个新特性,在android平台上我们可以通过反射直接在js中调用java的静态方法。它的使用方法很简单: var o = jsb.reflection.callStaticMethod(className, methodName, methodSignature, parameters...) 在callS...

js 调用微信浏览器内置方法,启动支付

$.post("{php echo app_url('pay/cash')}",{orderno:orderno,paytype:paytype},function(m){ //todo: 跳转到微信支付,获取支付的相关信息 if(!m.errno){...