[Javascript OO] 构造函数

OO: 类的概念, 通过类创建多个具有相同属性和方法的对象
封装 继承 多态

(1) 构造函数-> 创建对象

构造函数虽然首字母要大写,但是还是函数,只不过是用来创建对象的。
构造函数可以创建特定类型的对象。

<script type="text/javascript">
   function People(name,age){
           // 名称首字母必须大写
          this.name=name; // 直接将属性和方法给this对象
          this.age=age;
          //没有return
       }
       var jessica=new People("jessica",18);
       var krystal=new People("krystal",20);
       console.log(jessica);
       console.log(krystal);

       console.log(jessica instanceof People);
       console.log(krystal instanceof People);
       console.log(jessica instanceof Object);
       console.log(krystal.constructor==People);
       //构造器 指向了People

</script>

Result:

这里写图片描述


(2) * new 经历了4个步骤

eg:
    var jessica=new People("jessica",18);

[1] 创建一个空的对象 var obj={}
[2] 将构造函数的作用域给新的对象 (this -> obj)
[3] 执行构造函数的代码 (属性和方法给obj)
[4] return obj


(3) 可以创建对象也可以是普通函数

[1] new出现了就是创建一个新obj
[2] 普通

       function People(name,age){// 名称首字母必须大写
          this.name=name; // 直接将属性和方法给this对象
          this.age=age;
          //没有return
          this.say=function(){
             return this.name+":"+this.age;
          }
       }

       People("ljy",18);
       window.say();

(4) 构造函数的优点+缺点

优点:

创建对了相似对象(大量的实例化), 也解决了工厂模式的对象识别问题(这个对象是谁创建的, 对象的类型), 因为构造函数可以创建特定类型对象


缺点:

上面例子说明, jessica和krystal都有共同函数say(), 但是每次new 都要创建一个新的say(), 每次都创建相同的任务是没有必要的

缺点解决:

[1] 将共同的属性或方法转移到全局下

     function People(name,age){
          this.name=name;
          this.age=age;
          this.say=say;
       }
           function say(){
             return this.name+":"+this.age;
            }

问题:
虽然解决了问题, 但是此时作用域是在global下, 并且没有封装 [2] 解决了这个问题

[2] prototype 原型的概念
详见下一节

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值