zoukankan      html  css  js  c++  java
  • javascript中的构造函数和函数的原型属性

    <script>
    //构造函数
    //构造函数的缺点就是每个方法都要在每个实例上创建一边
    function Person(name,age,sex)
    {
     this.name=name;
     this.age=age;
     this.sex=sex;
     this.sayName=new Function("alert(this.name);");
    }
    var p1=new Person("yjc",26,"man");
    var p2=new Person("yjc1",26,"man");
    //p1,p2都有一个Function类型的方法,但这两个方法属于不同的Function类型的实例(即两个实例)
    p1.sayName();
    alert(p1.sayName==p2.sayName);//false

    //--------------------------------------------------------
    //我们可以这样改造构造函数
    function Person1(name,age,sex)
    {
     this.name=name;
     this.age=age;
     this.sex=sex;
     this.sayName=sayName;
    }
    //将sayName函数定义到构造函数的外面
    function sayName()
    {
     alert(this.name);
    }
    var p11=new Person1("yjc11",26,"man");
    var p12=new Person1("yjc12",26,"man");
    //这样Person1的两个实例p11和p12的sayName方法共享了全局作用域中的同一个函数
    //但是问题又出现了,这样的换就体现不到面向对象的封装性了,然而我们可以用函数的prototype(原型)来实现。
    alert(p11.sayName==p12.sayName);//true
    //---------------------------------------------------------

    function Person2(name,age,sex)
    {
     Person2.prototype.name=name;
     Person2.prototype.age=age;
     Person2.prototype.sex=sex;
     Person2.prototype.sayName=function(){
     alert(this.name);};
    }
    var p21=new Person2("yjc21",26,"man");
    var p22=new Person2("yjc22",26,"man");

    alert(p21.sayName==p22.sayName);
    //我们将sayName方法和属性添加到了 Person2的protortype原型里,Person2的实例同样具有了所有的属性和sayName方法,不同的是,实例p21,p22的属性和方法是所有实例共享的,换句话说,他们的实例访问的是同一组属性,和同一个sayName();
    //在默认情况先,我们创建的每个函数都有一个默认的原型prototype,他包含了该函数所有的属性和方法,prototype原型还有一个constructor属性,改属性指向当前实例的构造函数,即Person2
    //我们可以利用这个属性来扩展我们的函数

    </script>

  • 相关阅读:
    Mime Types
    对MySQL DELETE语法的详细解析
    创建MySQL存储过程示例
    Python安装
    python学习之matplotlib实战
    python学习之numpy实战
    SQLserver建表规则
    机器学习之BP神经网络
    机器学习之决策树算法
    Spring学习总结
  • 原文地址:https://www.cnblogs.com/lovejunxia/p/2012320.html
Copyright © 2011-2022 走看看