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属性的值是一个函数的对象。
function Text2 () {
}
var text2= new Text2();
// 构造函数的原型中预定义好的constructo。
console.log( Text2.prototype.constructor===Text2);//返回TRUE
console.log(text2.constructor==Text2);//返回TRUE
可以简单的理解
构造函数的原型可以使用 Range1.prototype来获取。
实例对象的原型可以使用 r2.constructor来获取。
JavaScript中的Java式的类继承
实例字段
它们是基于实例的属性或变量,用于保存独立对象的状态。
实例方法
它们是类的所有实例所共享的方法,由每个类单独使用。
类字段
这些属性或者方法属于类的,而不是属于类的某个实例的。
类方法
这些方法属于类的,而不是属于类的某个实例的
构造函数对象
构造函数对象为JavaScript的类定义了名字,任何添加到这个构造函数的属性都是类字段或者类方法(用类可以直接调用的方法或者字段就是属于类的相当于Java的static)
原型对象
原型对象的的属性被类的所有实例所继承,如果原型底线的属性是函数的话,这个函数就可以被任何 一个实例当做方法来调用。
实例对象
类的实例每个都是一个单独的对象,直接给这个对象定义的属性是不会被其他的所有实例所共享的,实际是 这个对象的私有属性。