主要内容:
1,constructor类的构造器,实例调用类构造器,构造函数
2,instanceof判断实例是否属于某个类
3,typeof判断变量指向类型
4,this实例指针
5,delete 类属性的删除,删除属性,类成员删除
6,prototype原型对象,类的扩展,扩展类属性,扩展类方法
7,静态属性,静态方法
8,私有属性
1,js类的构造器constructor
简单说可以理解为类的初始化函数,或者说类在实例化时自动执行的函数
简单例子:
function TestClass(){
this.a = "s";
alert(1);
}
var Nobj = new TestClass();
//主动调用构造函数
Nobj.constructor();
//执行后发现弹出两次1,证明构造器在实例化时执行了。主动调用也执行了
2,判断实例是否属于某个类
alert( Nobj instanceof TestClass);
3,判断变量指向类型
console.log(typeof Nobj)
4,实例指针this
console.log(Nobj.a)
//此时TestClass中的this就指向Nobj
谁调用构造器,那么构造器内部的this指针就指向“谁”
5,类属性的删除
语法:delete 对象名.属性
删除是原处修改,返回的是布尔值,无论属性存在没都返回true,所以不能用于判断属性是否存在
delete Nobj.a
6,原型对象prototype
简单理解:就是对象在找不到属性或方法的时候,会在一个叫原型对象的地方寻找,而prototype可以为原型对象扩展方法和属性。每一个类都有一个原型对象。
作用:
①修改属性
原型对象属性的修改,将影响所有的类的实例,只有实例独立设置了改属性,才不会受到影响
function TestClass(){
this.a = "s";
}
var obj1 = new TestClass();
var obj2 = new TestClass();
obj1.b = 10;
TestClass.prototype.b = 20;
console.log(obj1.b) //10
console.log(obj2.b) //20
②扩展原先的类
//扩展js内置的Date类,作用:返回未来几天的时间戳
Date.prototype.otherDate = function(day){
var newday = parseInt(day);
var end = new Date();
var d = new Date(end.valueOf() + 1*24*60*60*1000*newday);
return d;
}
//调用:
var ndate = new Date();
ndate.otherDate(10);
③继承
js不支持多重继承,语法上也并没有继承,可以利用prototype进行模拟继承
function TestClass1(){
this.a = "TestClass1";
}
function TestClass2(){
this.b= "TestClass2";
}
TestClass1.prototype =new TestClass2();
var obj1= new TestClass1();
console.log(obj1.b)
//TestClass1继承了TestClass2的b属性
7,静态属性/方法
在js类中,以类名定义的属性和方法称为静态属性/方法。
静态属性和方法不会被继承,也不会实例化给子类,只能通过类名.属性/方法调用
//静态属性计数
function TestClass(){
TestClass.count++,
TestClass.getCount=function(){
return TestClass.count;
}
}
TestClass.count=0;
var obj1= new TestClass();
var obj2= new TestClass();
var obj3= new TestClass();
console.log(TestClass.getCount()) //3
8,私有属性
通过this指针的定义的都是共有属性
通过var定义的都是私有属性
类的私有属性在不能通过实例来访问,保证类的环境独立。
类的内部私有属性的可以直接访问
function TestClass(){
var s = 5;
this.getData=function(){
s++;
return s;
}
}