JavaScript类和模块

JavaScript是基于对象的,每个JavaScript对象都是一个属性的集合,相互之间没有任何联系,在JavaScript中也可以定义对象的类,让每个对象都共享某些属性。

在JavaScript中,类的实现是基于原型继承机制的。 如果俩个实例都从同一个原型对象上继承了属性,我们就说他们是同一个类的实例。

如果俩个对象继承自同一个原型,往往意味着他们是有一个构造函数创建并初始化的。

JavaScript中类的一个重要特性“动态可继承”

类和原型。

在JavaScript中,类的所有实例对象都从同一个原型对象上继承属性,因此,原型对象是类的核心。

rang.js实现一个能表示值得范围的类。

 <script>
        function  range(from,to) {
            //用 range.methods作为原型创建一个新对象
            var r= Object.create(range.methods)
              r.from=from;//每个范围对象的私有属性from
            r.to=to;//每个范围对象的私有属性from
            return r; //返回一个新的r对象


        }
        //原型对象定义方法,这些方法为每个范围对象所继承。
  range.methods={
            // 这个方法比较值是否在这个对象的范围之内 ,this指代的就是调用这个方法的对象。
       includes:function (x) {
           return this.from<x&&this.to>x;
       },
 //重写toString
     toString:function () {return "("+this.from+"...."+this.to+")"

     }




  }
      var r=range(1,3); //创建一个r对象
        alert(r.includes(2)); //输出true
        console.log(r.toString()); //输出{1...3}

     </script>

类和 构造函数

上面的方式是定义类的一种方式,但是并不常用,因为毕竟它没有构造函数,构造函数就是 用来初始化对象的,使用关键字new来调用构造函数,使用new会创建一个新对象。因此构造函数只需要初始化这个新对象的状态即可,调用构造函数有一个非常重要的特征,构造函数的prototype属性被用来当做新对象的原型。这意味着通过同一个构造函数所创建的所有对象都继承自一个相同的对象,因此他们是同一个类。

使用构造函数来创建上面的那个类。

function  Range1(from,to) {
              //这俩个属性是私有的不可继承的。
               this.from=from;
               this.to=to;
          }
          //构造函数的prototype是所有创建对象的原型,所用用Range1 new出来的对象的原型都是这个对象
         Range1.prototype={

             // 这个方法比较值是否在这个对象的范围之内 ,this指代的就是调用这个方法的对象。
             includes:function (x) {
                 return this.from<x&&this.to>x;
             },
             //重写toString this 所代表的就是用new 创建出来的Range1的实例
             toString:function () {return "("+this.from+"...."+this.to+")"

             }


         }

         var r1=new Range1(1,3);//使用构造函数来创建一个对象
        alert(r1.includes(2)); //输出true
         console.log(r1.toString()); //输出{1...3}

构造函数和类的标识

原型对象是类的唯一标识;当且仅当俩个对象继承自同一个原型对象时,它们才是属于同一类的实例。

coustructor属性

将Range.prototype定义为一个新的对象,这个对象包含所需的方法,
其实也可以用单个对象直接量来方便的定义原型上的方法。

任何JavaScript函数都可以作为构造函数,都自动拥有一个prototype的属性,这个属性是一个对象,这个对象包含唯一一个不可枚举属性coustrutor属性,constructor属性的值是一个函数的对象。

可以简单的理解

构造函数的原型可以使用 Range1.prototype来获取。

实例对象的原型可以使用 r2.constructor来获取。

 function Text2 () {

          }

         var text2= new Text2();
        //  构造函数的原型中预定义好的constructo,啊而这个值一般都是构造函数本身
       console.log( Text2.prototype.constructor===Text2);//返回TRUE
       console.log(text2.constructor==Text2);//返回TRUE

所以我们有俩中方式来

1重写原生对象。

function Rang3() {

       }

       Rang3.prototype={
                  constructor:Rang3, //新定义的对象不含有这个属性,必须显示的设置构造函数反向引用
           toString:function () {

               return "tostring";

           }



       }

2另外一种方法就是使用预定义的原型对象,预定义的原型对象包含constructor对象,然后依次给原型对象添加方法。

 Rang3.prototype.toString=function () {
       return  "";
  }
 Rang3.prototype.from=function () {

 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值