构造函数与构造函数的继承以及call和apply的区别

//(一)、工厂模式
   /* 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的
   过程.
   **/
   //下面首先来个简单易懂的例子吧!注释很详细,不理解的朋友一起来看看吧!
   //1.普通函数
   function  demo(){
        //第一步:进入工厂,创建个函数;
        var obj = new Object();
        //第二步:进行"加工"
        obj.name = "张三";
        obj.age = 20;
        obj.showname = function(){
            alert(obj.name);
        }
        //第三步:"出厂"
        return obj;//也有不用return的,不过感觉这样更好理解点
   }
   var obj = demo();
   console.log(obj.name);//输出:"张三"
   //也可调用方法
   obj.showname();
   //这就是一个完整的工厂模式了,这是从比较好理解的一方面讲解的
   
  //2.构造函数 构造函数通过上边的工厂模式也可以转变成一个简单的构造函数
  //先看下例子:
  function Bemo(name,age,showname){
      this.name = name;
      this.age = age;
      this.showname = showname;//这个方法在这采用直接传入都可以
  }
  //构造函数需要用new产生新的函数
  var obj1 = new Bemo("张三","18",function(){alert(this.name)});
  console.log(obj1.name)
  //构造函数也可以通过原型对象prototype来添加属性
  Bemo.prototype.sex = "男";
  console.log(obj1.sex);
  //通过原型链追加的属性,构造出的其他函数也可以调用
  var obj2 = new Bemo("李四","20",function(){console.log("hello world!")});
  console.log(obj2.sex);//这样看来这样追加的属性,是个公共属性都有的可以调用,要记住啊
  
  /*在ECMAscript中的狗早函数可用来创建特定类型的对象.像Object和Array这样的原生构造函数,
  在运行时会自动出现在执行环境中.
    此外,也可以创建自定义的构造函数,从而定义自定义对象类型的属性和方法;
    再冲心举个构造函数的例子
  */
  //构造一个人的类,javascript没有类的概念,使用构造函数模拟类使用的,更加方便
  function Person(name,age,sex,job){
      this.name = name;
      this.age = age;
      this.sex = sex;
      this.job = job;
      this.say = function(){
          alert("hello world!");
      };
      this.sayName = function(){
          alert(this.name);
      }
  }
  Person.prototype.walk = function(){
      alert("没事儿走两步");
  }
  var person1  = new Person("赵四",25,"男","警察");
  var person2 = new Person("小李",20,"女","空姐");
  console.log(person1.name);
  person2.say();
  /*在这个例子中,Person()函数取代了普通函数的名字,构造函数有普通函数的区别有:*/
  //1.一个比较直观,并且需要遵守的一个约定,构造函数的命名首字母要用大写
  //2.没有显式的创建对象;
  //3.直接将属性和方法付给了this对象
  //4.没有return语句
  
  
  //构造函数 new的作用
  /*
    1.可以重新创建一个空的新对象
    2.让空对象去调用构造函数给自己赋值(也就是使用心得对象去掉函数,this也就是当前创建的新对象)
    3.执行构造函数中的代码(为这个新对象添加属性)
    4.返回心对象
  */
  
  //3.继承
  /*
    在这只简单介绍比较好理解的
    直接从例子开始
  */
  function Father(name,money,house){
      this.name = name;
      this.money = money;
      this.house = hose;
  }
  function Son(name,money,house){
      //或 Father.call(this,name,money,house)
      Father.apply(this,[name,money,house]);
  }
  var son = new Son("李",200,"100平米");
  //这个是直接继承父亲的属性name,money和house;用apply或call实现继承
  //apply和call的区别 call后边是直接加参数串,apply后边是加数组
   function Father(name,money,house){
      this.name = name;
      this.money = money;
      this.house = hose;
  }
  Father.protoype.firstName = "沈";
  Object.prototype.hobby = "篮球";//对象的原型
  function Son(name,money,house){
      //或 Father.call(this,name,money,house)
      Father.apply(this,[name,money,house]);
  }
  Son.prototype.firstName = Father.prototype.firstName;
  alert(son.firstName);
  //这样就是继承父级的原型对象
  //继承是一个原型链 先找自身有没有要查找的类和方法,如果没有向上从自身的原型里找,
  //如果没有继续往上对象Object里找,,如果还没有就输出undefined;(万物皆对象)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值