1.js中定义的类没有父子关系,但这些类都是Object类的子类
js作为一种动态语言,允许自由地为对象增加属性和方法。
当程序为对象的某个不存在的属性赋值时,即可认为时为对象增加属性。
var p={};//定义一个对象,没有任何属性和方法
p.age=30;//为p对象增加age属性
p.info=function(){
alert("hello");
}//为对象增加info属性,也就是增加了方法
2.对象和关联数组
js中对象本质上是一个关联数组,由一组key-value对组成。
与java中Map对象有所不同的是,js对象中的value不仅可以是值,也可以是函数
当访问到某个js对象的属性时,不仅可以使用obj.xxxx的方式,也可以采用obj[xxx],有时候必须使用这种形式
3.用prototype实现在js中的继承
js虽然也支持类、对象的概念,但没有继承的概念,只能通过一些特殊手段来实现继承
通常不建议在函数定义中直接为函数定义方法,而是采用prototype属性
js中所有类(也就是函数)都有一个prototype属性,如果为js类的prototype属性增加属性和方法,可视为对原有类的扩展。即增加了prototype属性的类继承了原有的类,实现伪继承,并不是产生了一个新的子类。
<script>
function Person(name,age){
//将局部变量赋值给实例属性name、age
this.name=name;
this.age=age;
}
Person.prototype.walk=function(){
alert(this.name+",慢慢地走");
}
var p=new Person("ls",20);
p.walk();
</script>
通过prototype可以对js的内嵌类进行扩展,但一定要将这段代码放在JavaScript脚本的开头,这样内嵌类实例才能有扩展的方法。尽量避免使用,安全性和稳定性不高
<script>
Array.prototype.indexof=function(obj){`在这里插入代码片`
//
var result=-1;
for(var i=0;i<this.length;i++){
//
if(this[i]==obj)
{
//
result=i;
break;
}
}
return result;
}
var arr=[4,5,7,-2];
alert(arr.indexof(-2));
</script>
4.原型链法继承
在继承“父类”方法上,更占优势。
<script>
function Person(name,age){
this.name=name;
this.age=age;
}
Person.prototype.sayHello=function(){
console.log(this.name+"向您打招呼!");
}
var per=new Person("ls",20);
per.sayHello();//
function Student(grade){
this.grade=grade;
}
//
Student.prototype=new Person("未命名",0);
Student.prototype.intro=function(){
console.log("%s是个学生,读%d年级",this.name,this.age,this.grade);
}
var stu=new Student(5);
stu.name="sweer";
stu.sayHello();
stu.intro();
</script>
Student.prototype=new Person(“未命名”,0); 可以把Person中属性和方法都继承过来,但是在参数值传递的过程中,需要依次进行赋值。
5.对象冒充继承
在继承父类的属性上,更占优势。
function Person(name,age){
this.name=name;
this.age=age;
}
Person.call(this,name,age);
Person.apply(this,[name,age]);
原型链法和对象冒充继承二者交替使用,效果更好