Javascript学习笔记(二)Javascript核心之类,构造函数和原型
javascript并不支持真实的类(像JAVA,C#,C++),但是它可以通过构造函数和属性定义伪类.
构造函数:通过构造函数来定义一个对象类,使用它的参数来初始化this关键字所引用的对象的属性.构造函数只是初始化了特定的对象,但并不返回这个对象.通过new 调用构造函数.
原型对象和继承:Javascript对象继承原型对象的所有属性.一个对象的原型是由创建并初始化该对象的构造函数定义的.Javascript中的所有属性都有prototype属性,它引用了一个对象.看下面的例子.
//构造函数初始化不同实例的属性
function Rectangle(w, h) {
this.width = w;
this.height = h;
}
Rectangle.prototype.area = function( ) { return this.width * this.height; }//原始对象保存方法并共享实例的其他属性
注意,继承是在查询一个属性值时自动发生的.每个类都有一个原型对象,这个原型对象都具有一套属性.他们可以通过for/in被列举出来并且可以用in操作符来测试.但是只能用object.hasOwnProperty()方法来区分,如:
var r = new Rectangle(2, 3);
r.hasOwnProperty("width"); // true: width 是r的一个直接属性
r.hasOwnProperty("area"); // false: area是r的一个继承属性
"area" in r; //true: "area"是r的一个属性
读写继承属性:属性的继承只发生在读属性值时,而在写属性值时不会发生.下面通过一个例子说明:![](https://www.cnblogs.com/images/cnblogs_com/gavindou/20070718/javascript9-1.jpg)
不仅是用户自定义类有原型对象,内置类如String和Date也有原型对象,并且可以赋值给他们.如:
String.prototype.endsWith = function(c) {
return (c == this.charAt(this.length-1))
}//如果最后一个字符是"c"将返回true
var message = "hello world";
message.endsWith('h') // Returns false
message.endsWith('d') // Returns true
Javascript中的模拟类:默认情况下,任何对象属性都是实例属性,为了真实地模拟面向对象的程序设计语言,我们说Javascript中的实例属性是那些在对象中用构造函数创建的或初始化地属性.实例方法和实例属性非常相似,只不过它是方法而不是数值.实例方法是由特定对象或实例调用的.在Javascript中必须用this特别指明属性.
类属性:在Javascript中,Number.MAX_VALUE就是类属性的一个例子,因为属性MAX_VALUE就是通过类Number来存取的.由于每个类属性只有一个副本,所以本质上说来属性是全局变量.
类方法:一个与类关联在一起的方法,而不是和类的实例关联在一起的方法.要调用类方法,必须使用类本身,而不能使用该类的特定实例.如Date.parse()就是一个类方法.
通用对象方法:toString(),valueOf(),compareTo()
超类和子类:Object是所有内部类的超类,本章中使用的类都是Object的直接子类.
无继承扩展:
构造函数:通过构造函数来定义一个对象类,使用它的参数来初始化this关键字所引用的对象的属性.构造函数只是初始化了特定的对象,但并不返回这个对象.通过new 调用构造函数.
原型对象和继承:Javascript对象继承原型对象的所有属性.一个对象的原型是由创建并初始化该对象的构造函数定义的.Javascript中的所有属性都有prototype属性,它引用了一个对象.看下面的例子.
//构造函数初始化不同实例的属性
function Rectangle(w, h) {
this.width = w;
this.height = h;
}
Rectangle.prototype.area = function( ) { return this.width * this.height; }//原始对象保存方法并共享实例的其他属性
注意,继承是在查询一个属性值时自动发生的.每个类都有一个原型对象,这个原型对象都具有一套属性.他们可以通过for/in被列举出来并且可以用in操作符来测试.但是只能用object.hasOwnProperty()方法来区分,如:
var r = new Rectangle(2, 3);
r.hasOwnProperty("width"); // true: width 是r的一个直接属性
r.hasOwnProperty("area"); // false: area是r的一个继承属性
"area" in r; //true: "area"是r的一个属性
读写继承属性:属性的继承只发生在读属性值时,而在写属性值时不会发生.下面通过一个例子说明:
![](https://www.cnblogs.com/images/cnblogs_com/gavindou/20070718/javascript9-1.jpg)
不仅是用户自定义类有原型对象,内置类如String和Date也有原型对象,并且可以赋值给他们.如:
String.prototype.endsWith = function(c) {
return (c == this.charAt(this.length-1))
}//如果最后一个字符是"c"将返回true
var message = "hello world";
message.endsWith('h') // Returns false
message.endsWith('d') // Returns true
Javascript中的模拟类:默认情况下,任何对象属性都是实例属性,为了真实地模拟面向对象的程序设计语言,我们说Javascript中的实例属性是那些在对象中用构造函数创建的或初始化地属性.实例方法和实例属性非常相似,只不过它是方法而不是数值.实例方法是由特定对象或实例调用的.在Javascript中必须用this特别指明属性.
类属性:在Javascript中,Number.MAX_VALUE就是类属性的一个例子,因为属性MAX_VALUE就是通过类Number来存取的.由于每个类属性只有一个副本,所以本质上说来属性是全局变量.
类方法:一个与类关联在一起的方法,而不是和类的实例关联在一起的方法.要调用类方法,必须使用类本身,而不能使用该类的特定实例.如Date.parse()就是一个类方法.
通用对象方法:toString(),valueOf(),compareTo()
超类和子类:Object是所有内部类的超类,本章中使用的类都是Object的直接子类.
无继承扩展: