《JavaScript权威指南(第六版)》笔记0x6 类和模块

类和原型

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

    如果定义一个原型对象,然后通过inherit()函数创建一个继承自它的对象,这样就定义了一个JavaScript类。通常,类的实例还需要进一步的初始化,通常是通过定义一个函数来创建并初始化这个新对象。

//range.js实现一个能表示值的范围的类
//这个工厂方法返回一个新的”范围对象“
function range(from,to){
    //原型对象作为函数的一个属性存储,并定义所有“范围对象”所共享的方法
    var r = inherit(range.methods);//存储新的“范围对象”的起始位置和结束位置
    //这两个属性是不可继承的,每个对象都有唯一的属性
    r.from = from;
    r.to = to;
    return r;//返回新创建的对象
}
//原型对象定义方法,这些方法为每个范围对象锁继承
range.methods = {
    includes:function(x){
        return this.from<=x&&x<=this.to;
    },
    foreach:function(f){
        for(var x=Math.ceil(this.from);x<=this.to;x++)f(x);
    },
    toString:function(){
        return "("+this.from+"..."+this.to+")";}
    }
};
var r = range(1,3);
r.includes(2);//=>true
r.foreach(console.log);//输出1 2 3
console.log(r);//输出(1...3)

 类和构造函数

    使用new调用构造函数会自动创建一个新对象,因此构造函数本身只需初始化这个新对象的状态即可。调用构造函数的一个重要特征是,构造函数的prototye属性被用做新对象的原型。这意味着通过同一个构造函数创建的所有对象都继承自一个相同的对象,因此它们都是同一个类的成员。

//range2.js表示值的范围的类的另一种实现
//这是一个构造函数,用以初始化新创建的“范围对象”
//注意,这里并没有创建并返回一个对象,仅仅是初始化
function Range(from,to){
    //这两个属性是不可继承的,每个对象都拥有唯一的属性
    this.from = from;
    this.to = to;
}
//所有“范围对象”都继承自这个对象
//注意属性的名字必须是prototype
Range.prototype={
    includes:function(x){
        return this.from<=x&&x<=this.to;
    },
    foreach:function(){
        for(var x=Math.ceil(this.from);x<=this.to;x++)f(x);
    },
    toString:function(){
        return "("+this.from+"..."+this.to+")";
    }
};
var r = new Range(1,3);//创建一个范围对象
r.includes(2);//=>true
r.foreach(console.log);//输出1 2 3
console.log(r);//输出 (1...3)

     在JavaScript中定义类的步骤可以缩减为一个分三步的算法。第一步,先定义一个构造函数,并设置初始化新对象的实例属性。第二步,给构造函数的prototype对象定义实例的方法。第三步,给构造函数定义类字段和类属性。

类的扩充

    avaScript中基于原型的继承机制是动态的:对象从其原型继承属性,如果创建对象之后原型的属性发生改变,也会影响到继承这个原型的所有实例对象。

 模块

    将代码组织到类中的一个重要原因是,让代码更加“模块化”,可以在很多不同场景中实现代码的重用。但类不是唯一的模块化代码的方式。一般来讲,模块是一个独立的JavaScript文件。模块文件可以包含一个类定义、一组相关的类、一个实用函数库或者是一些待执行的代码。只要以模块的形式编写代码,任何JavaScript代码段就可以当做一个模块。 JavaScript中并没有定义用以支持模块的语言结构(但imports和exports的确是JavaScript保留的关键字,因此JavaScript的未来版本可能会支持),这也意味着在JavaScript中编写模块化的代码更多的是遵循某一种编码约定。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值