原 Javascript基础——Javascript语言核心(6):类和模块;

类和模块

在Javascript中,的实现是基于其原型继承机制。如果两个实例都从同一个原型对象上继承了属性,它们是同一个类的实例。

9.1 类和原型

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

9.2 类和构造函数

使用关键字new来调用构造函数。构造函数的prototype属性被用作新对象的原型。

定义构造函数既是定义类,并且类名首字母要大写

function Range(from,to){
    this.from=from;
    this.to=to;
}
Range.prototype={
    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);
        }
    }
}
var r = new Range(1,3); //创建对象

r.includes(2);          //=>true: 2在范围内
r.foreach(console.log); //输出1 2 3

9.2.1 构造函数和类的标识

原型对象唯一标识,而初始化对象的状态的构造函数不能作为类的标识

举例:两个构造函数的prototype属性可能指向同一个原型对象,那么这两个构造函数创建的实例属于同一个类。

构造函数名字通常用做类名

9.2.2 constructor属性

在9.2的例子中,将Range.prototype定义为一个新对象,这个对象包含类所需要的方法。其实没有必要新创建一个对象,用单个对象直接量的属性就可以定义原型上的方法。

每个Javascript函数(ECMAScript 5中的Function.bind()方法返回的函数除外)都自动拥有一个prototype属性,这个属性值是一个对象,包含唯一一个不可枚举属性constructor

var F = function(){};
var p = F.prototype;
var c = p.constructor;
c===F //=> true: 对于任意函数F.prototype.constructor == F

构造函数的原型中存在预先定义好的constructor属性,意味着对象通常继承的constructor均指代它们的构造函数。constructor属性为对象提供了类。

9.3 Javascript中Java式的类继承

定义类的步骤:

  1. 定义构造函数,初始化新对象的实例属性
  2. 给构造函数的prototype对象定义实例的方法
  3. 给构造函数定义类字段和类属性

9.7 子类

在面向对象编程中,类B可以继承自另外一个类A。A称为父类(superclass),B称为子类(subclass)。B的实例从A继承了所有的实例方法。

9.7.1 定义子类

Javascript的对象可以从类的原型对象中继承属性(通常继承的是方法)。

如果O是类B的实例,B是A的子类,那么O也一定从A中继承了属性。为此,确保B的原型对象继承自A的原型对象。

//通过原型继承创建一个新对象
function inherit(p){
    //p是一个对象,但不能是null
    if(p == null){
        throw TypeError();
    }

    //ES5的方式:Object.create()
    if(Object.create){
        return Object.create(p);
    }

    //ES3的方式
    var t=typeof p;
    if(t!=="object" && t!=="function"){
        throw TypeError();
    }
    function f(){}; //定义一个空构造函数
    f.prototype = p;
    return new f();
}

function A(){};
function B(){};

B.prototype = inherit(A.prototype);
B.prototype.constructor = B;
相关文章
相关标签/搜索