JavaScript面向对象
准确的说JavaScript是基于对象,而不是面向对象,因为没有想C++/java/c#那样的类,抽象,接口等;
1.创建对象;
没有类,属性和方法都是在对象创建以后定义的;
<script type="text/javascript">
//创建了一个空的object对象;
var object = new Object();
//定义属性;
object.name="张三"
object.age="22";
//定义方法;
object.getName =function (){
return this.name;
}
object.getAge =function (){
return this.age;
}
//调用方法;
console.log(object.getName())
</script>
2.自定义构造函数:
<script type="text/javascript">
//构造函数和普通函数最大的区别是就是首字母大写的;
function Student(name,age,sex){
this.name=name;
this.age=age;
this.sex=sex;
this.study=function(){
console.log("正在学习");
}
}
var student1=new Student("lucy",18,1);
console.log(student1.name)
student1.study();
</script>
当然在给对象定义属性的时候还可以这样写:
var o = new Object();
o["name"]="zhangsan";
o["age"]=100;
3.对象的字面量:
就相当于java中的 int[] aa=[1,2,3];
只不过是键值对的形式;
和json是一样的,只不过json中的key要带引号;
<script type="text/javascript">
var obj={
name:"zhangsan",
age:18,
sex:1,
arr:[],
oo:{},
ff:function(){
console.log("对象的字面量");
}
}
</script>
4.遍历对象中的所有的属性:
<script type="text/javascript">
var obj={
name:"zhangsan",
age:18,
sex:1,
arr:[],
oo:{},
ff:function(){
console.log("对象的字面量");
}
}
//遍历obj对象中的所有的属性;
for(var key in obj){
console.log(key);
console.log(obj[key]);
}
</script>
5.基本数据类型和引用数据类型;
基本数据类型:string number Boolean
其余都是引用数据类型 包括function函数;
和java中的原理是一样的;哪些是拷贝的,那是引用的;
6.函数数据类型
在javascript中函数是一种数据类型,所以可以作为函数参数传递;
如果定义一个构造函数,在构造函数内部声明定义一个函数的话,每次创建对象的时候都会创建一个这样的函数;和java不同的是每个对象中的同样函数也是不相同的;是独立存在的。所以有一万个这样的对象的话,就有一万个这个样的函数;
所以当函数定义放在全局变量中,当对象创建的时候在构造函数中进行函数赋值操作;但是这样又有一个问题,这样就污染了全局变量的命名空间;也不符合封装的思想;
这个时候就引入一个概念:
原型对象:每一个方法在调用的时候都会创建一个原型对象prototype,这个原型对象相当于java中的静态全局对象,所有的对象所共享的一个成员对象;
如果是普通函数,可以动过方法名.prototype等到该对象;
如果是构造函数,可以通过方法名点prototype、通过对象点prototype得到该对象(这种方式会先在对象中找,如果找不到会在原型对象中找;但是如果在对象中定义了这个方法,现在对象中找到了,就不会去原型对象中找了);
<script type="text/javascript">
function Student(aaa){
this.aaa=aaa;
}
//原型對象;所以在定义方法的时候一般定义在原型对象中;
Student.prototype.fang=function(){
console.log(this.aaa)
}
var s1=new Student("111");
var s2=new Student("222");
s1.fang();
s2.fang();
console.log(s1.fang==s2.fang);//true
</script>
其实原型对象中,还有一个原型对象object对象,但是原型object是没有原型对象(prototype=null),一些方法封装在这个原型对象中;
<script type="text/javascript">
function Student(aaa){
this.name=aaa;
}
//原型對象;所以在定义方法的时候一般定义在原型对象中;
Student.prototype.fang=function(){
console.log(this.name)
}
var s1=new Student("111");
var s2=new Student("222");
s1.fang();
s2.fang();
console.log(s1.fang==s2.fang);//true
//判断一个对象中有没有某个属性,如果有返回true,如果没有的话,在原型对象中找,有返回true,没有返回false;
console.log("name" in s1);
//如果只想在是s1对象中找有没有某个属性;但是s1中没有定义hasOwnProperty函数呀,其实定义在原型对象中的;
console.log(s1.hasOwnProperty("name"));
</script>
7.修改toString方法
因为对象中的toString方法是定义在原型中,所以要修改原型中的;
8.array的遍历
这个api在ie8以上才可以;
var arr=[1,2,3,4,5];
arr.forEach(function(value,index,arr){
console.log(value);
});
9.修改函数中的this对象
在javascript中函数也是对象,有自己的方法
其中方法call和apply就可以修改传进去的this对象
例如:
var fang = function(){}
var obj = new Object();
fang.call(obj); //此时fang函数已经调用了;
则方法fang中的this对象就是obj了;