zoukankan      html  css  js  c++  java
  • JavaScript高级程序设计读书笔记(3)

    面向对象程序设计

    1.创建对象

            <script type="text/javascript">
                var person=new Object();
                preson.name="zhangsan"
                person.age=13;
                person.sayAge=function(){
                    alert(this.age);
                }
            
            </script>


    这种方式有一个明显的缺点:使用同一个接口创建很多对象,会产生大量的重复代码。

    2.工厂模式

            <script type="text/javascript">
                function creatPerson(name,age){
                    var o=new Object();
                    o.name=name;
                    o.age=age;
                    o.sayAge=function(){
                        alert(this.age);
                    }
                    return o;
                }
                var person1=creatPerson("zhangsan",12);
                var person2=creatPerson("lisi",15)
                person1.sayAge();//12
                person2.sayAge();//15
            
            </script>


    3.构造函数创建对象

            <script type="text/javascript">
                function Person(name,age){
                    this.name=name;
                    this.age=age;
                    this.sayAge=function(){
                        alert(this.age);
                    }
                }
                var person1 =new Person("zhangsan",19);
                var person2 =new Person("lisi",20);
                person1.sayAge();//19
                person2.sayAge();//20
            </script>


    person1和person2都保存着Person的一个不同实例。这两个对象都有一个costructor属性,该属性指向Person。

                alert(person1.constructor==Person);//true
                alert(person2.constructor==Person);//true

    构造函数的调用:

    1.作为构造函数调用

    2.作为普通函数调用

                Person("zhangsan",17);
                window.sayAge();//17

    在另一个对象的作用域中调用

                var obj=new Object();
                Person.call(obj,"zhangsan",18);
                obj.sayAge();//18

    构造函数模式虽然好用,但是每个方法要在么个实例上重新创建一遍,前面的例子中,person1和person2都有一个名为sayName()的方法,但那两个方法不是同一个Function的实例。因此每定义一个函数,也就是实例化了一个对象。所以构造函数也可以 这样定义:

                function Person(name, age){
                    this.name = name;
                    this.age = age;
                    this.sayAge =new Function("alert(this.age)");
                }


    为了避免创建多个Function对象,可以将函数定义到构造函数外部

                function Person(name, age){
                    this.name = name;
                    this.age = age;
                    this.sayAge =sayAge;
                }
                function sayAge(age){
                    alert(this.age);
                }


    原型模型:

     创建的每一个函数都有一个prototype属性,这个属性是一个对象,它的用途是包含可以由特定类型的所有实例共享的属性和方法。那么prototype就是通过调用构造函数而创建的那个对象的原型对象。使用原型的好处是可以让所有对象实例共享它所包含的属性和方法。换句话说,不必在构造函数中定义对象信息,而是可以将这些信息直接添加到原型对象中。

            <script type="text/javascript">
                function Person(){}
                Person.prototype.name="zhangsan";
                Person.prototype.age=12;
                Person.prototype.setAge=function(){
                    alert(this.age);
                }
                var person1=new Person();
                var person2=new Person();
                person1.setAge();//12
                person2.setAge();//12
            </script>


    更简单的原型模型

            <script type="text/javascript">
                function Person(){}
                Person.prototype={
                    name:"zhangsan",
                    age:14,
                    sayAge:function(){
                        alert(this.age);
                    }
                }
                var person1=new Person();
                var person2=new Person();
                person1.sayAge();//14
                person2.sayAge();//14
            </script>

    原型模型的动态性

            <script type="text/javascript">
                function Person(){}
                Person.prototype={
                    name:"zhangsan",
                    age:14,
                    sayAge:function(){
                        alert(this.age);
                    }
                }
                var person1=new Person();
                Person.prototype.sayHi=function(){
                    alert("hi");
                }
                person1.sayHi();
            </script>


    通过构造函数初始化原型

            <script type="text/javascript">
                function Person(name,age){
                    this.name=name;
                    this.age=age;
                    if(typeof this.sayAge!="function"){
                        Person.prototype.sayAge=function(){
                            alert(this.age);
                        }
                    } 
                }
                var person=new Person("zhangsan",13);
                person.sayAge();
            </script>
  • 相关阅读:
    vue项目index.html缓存
    vue刷新当前页面
    keep-alive
    JS刷算法题:二叉树
    CSS动效集锦,视觉魔法的碰撞与融合(三)
    算法:栈和队列题目集合(一)
    浅谈设计模式(二):装饰器模式|中介模式|原型模式
    聊聊JS的二进制家族:Blob、ArrayBuffer和Buffer
    浅谈设计模式(一):状态模式|外观模式|代理模式
    纵论WebAssembly,JS在性能逆境下召唤强援
  • 原文地址:https://www.cnblogs.com/malinkang/p/2656191.html
Copyright © 2011-2022 走看看