- 关于对对象的理解:
- -
如Java,c++是面向对象的编程,严格来讲,JavaScript并没有达到那些复杂语言的标准,所以被称为基于对象的标准。
JavaScript支持多种对象,由程序员定义的对象,核心内置的对象,浏览器对象(BOM),文档对象(DOM)
object对象是JavaScript的原始对象,所有其他对象都是从该对象衍生出来的。
- 对象的创建:
使用构造函数创建对象,通过new可以创建一个对象,即使用构造函数创建对象,为了与普通的函数区别开来,构造函数在命名时通常是首字母大写。
如:var cat=new object();这样就创建了一个对象cat,new之后,对象的引用被返回赋给一个变量。
关于对new的补充:上面的例子,可以通过运算符new创建对象的实例,函数名写在new之后,new就会将该函数视为构造函数,这个函数可以是JavaScript的内置的构造函数,也可以是用户自定义的构造函数,JavaScript内置的构造函数有:object(),array(),date(),regexp()等。
- 对象的属性:
属性是用来描述对象的,且属性只能通过其所属的对象进行访问,如:
<script type="text/javascript">
var toy=new Object();//使用构造函数创建对象。
toy.name="hello";//给对象的属性赋值,其中属性也是自己自定义的。
toy.wode="nihao";
</script>
调用 :
document.write(toy.name+" "+toy.wode);
补充:
window是浏览器对象模型的顶层对象,它是所有父节点的父节点,由于document是window的子节点,所以它不仅仅是一个对象,同时还是window对象的属性,背景颜色bgcolor虽然是document对象的一个属性,但它本身并不是对象(它就是一个形容词,因为它是用来描述document的)。
- 对象的方法:
对象的方法类似于函数,唯一的区别在于函数是一段独立的程序单元,而方法是依附对象的,能且只能用this关键字引用的方式来通过对象访问它,共同点就是都需要有参数并都可以返回值,如:
<script type="text/javascript">
var toy=new Object();
toy.name="hello";
toy.wode="nihao";
toy.display=pritn;//把一个函数名赋值给属性,表示这个属性将作为对象的一个方法使用,
function pritn(){
document.write("i love you!!");
}
</script>
这是一种构建方法的方法,直接简单点如下:
<script type="text/javascript">
var test=new Object();
test.display=function( a){
document.write(a+"hello!!!!....");
}
</script>
- JavaScript中的类:
在JS中函数名当做对象的类名称,函数体定义其属性和方法。
一个简单例子:
//关于类的定义
function book(){
this.title="love";//其中this被用来为刚创建的对象设置属性,在类体中,this指向当前的对象。
this.author="bin";
}
调用:
var test=new book();
alert(book.title);
- 关于内联或匿名函数作为对象的方法:
首先理一下
function book(){//这是构造方法,但是也是一个类。
this.title="love";
this.author="bin";
}
前面我们方法中,我们把一个函数作为方法使用都是把这个函数放在构造函数之外定义的,如:
<script type="text/javascript">
var toy=new Object();
toy.name="hello";
toy.wode="nihao";
toy.display=pritn;//把一个函数名赋值给属性,表示这个属性将作为对象的一个方法使用,
function pritn(){
document.write("i love you!!");
}
</script>
然后当我们在函数的构造方法(类的定义)中写入匿名函数,如:
function distance(r,t)[
this.rate=r;
this.time=t;
this.calculate=function(){
return r*t;}
]
这样做的好处是:实现了对该方法的封装,即只有distance类的对象才可以访问该方法。而之前的方法,那些函数可以被任何类调用。
- with关键字:
作用:可以通过简洁的代码来引用对象的属性和方法,但是需要更长的运行时间,这是由于JavaScript需要对with块中的每个变量作检查,看它们是否是当前对象的属性,如:
function book(title,author,publisher){
this.title=title;
this.author=author;
this.publisher=publisher;
this.show=show;//定义一个方法
}
function show(){
with(this){
var info="the title is"+title;//即使用with关键字可在引用对象属性时省略对象名和点,或者是this关键字。
}
}
- 关于for/in循环:
可以遍历对象属性或者数组元素,对于对象中的每个属性(或者数组中的每个元素),依次获得属性名(元素名)并针对该属性(元素)执行后面语句块中的语句。是一种操作对象属性的常见方式,如:
<script>
var test=new Object();
test.a="hello";
test.b="fang";
for(var js in test){
document.write(test[js]+"<br />");
}
</script>
显示为:
如果把上面的代码部分该为你:
for(var js in test){
document.write(js+"<br />");
}
输出为:
所以存放在第一个参数中的内容是属性名,而不是具体的属性内容。
- 关于通过原型扩展对象:
JavaScript中任何构造函数都带有一个原型对象,原型对象中包含的属性可以被所有的对象继承。
1. 使用prototype属性为对象添加属性:
在Java和c++这种面向对象的编程语言中,对象的属性和方法是封装在一个容器中的,这个容器就是类,通过对类的继承可以实现对类的功能的重用和扩展,但是在JavaScript中没有类的机制,我们通过在其中使用构造函数和new关键字来模拟生成类,那么在实现继承时候,可以通过原型扩展的方法实现。
每个由类创建的对象都有两个属性,constructor:对创建对象函数的引用。
prototype:对原型对象的引用,如:
var test1=new Object();
var test2=new Object();
test1.show="hello";
domcument.write(test1.show);//调用对象的方法
domcument.write(test2.show);//不存在这个原型。
如何将属性扩展到类的所有的实例中呢?如:
var test1=new Object();
var test2=new Object();
Object.prototype.show="hello";
domcument.write(test1.show);
domcument.write(test2.show);
实现了扩展也就实现了继承,这就是JavaScript中对继承的模拟。
2.原型查找链:
当JavaScript要获取一个属性的值的时候,发现属性并没有直接在构造函数中定义,于是检查book原型是否定义了该属性,如果没有,继续向链条的顶部搜索,最后到达Object对象。所以顺序是:构造函数->原型->Object
3.使用原型为对象添加方法:
如上:
Object.prototype.test=function test(){
return 100;
}