对象基本概念
js支持以下几种对象:
1.用户自定义对象
2.核心或内置对象(Date,String,Number等)
3.浏览器对象(BOM)
4.文档对象(DOM)
对象的方法:
把一个函数名赋给属性,则这个属性将作为对象的一个方法使用。
<script type="text/javascript"> var toy = new Object(); toy.color = "red"; toy.display = printObject(); function printObject() { alert(toy.color); } toy.display(); </script>结果:red
创建“类”及其对象:
js不像Java或C++中有类的机制,而是通过函数来定义。
<script type="text/javascript"> function Book() { this.name="abc"; } var bookObj = new Book; alert(bookObj.name); </script>
结果:abc
注:可以动态地为js中的对象添加属性:
<script type="text/javascript"> function Book() { this.name="abc"; } var bookObj = new Book; bookObj.date = "1990" alert(bookObj.date); </script>结果:1990
内联函数作为对象的方法:
内联函数在构造函数中直接赋值给属性,免去了第一个例子中先定义再赋值的麻烦。
<script type="text/javascript"> function Book() { this.name="abc"; this.msg = function() {alert(this.name);} } var bookObj = new Book; bookObj.msg(); </script>
结果:abc
通过对象字面量,可以不通过调用构造函数的方式创建对象。
对象字面量使用key/value的方式来表示对象属性,并且可以嵌套。
语法如下:
1.使用冒号分隔键值
2.使用逗号分隔每组键/值
3.最后一组键值省略逗号
4.整个对象封装在一对括号中
普通对象字面量:
<html> <head> <meta http-equiv="content-type" content="text/html; charset=windows-1250"> <meta name="generator" content="PSPad editor, www.pspad.com"> <title></title> <script type="text/javascript"> var soldier = { name: undefined, rank: "captain", fallIn: function() { alert("fallIn"); }, fallOut: function() { alert("fallOut"); } }; </script> </head> <body> <script type="text/javascript"> soldier.name = "Tom"; alert(soldier.name); soldier.fallIn(); soldier.fallOut(); </script> </body> </html>
嵌套对象字面量:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=windows-1250"> <meta name="generator" content="PSPad editor, www.pspad.com"> <title></title> <script type="text/javascript"> var soldier = { name: undefined, rank: "captain", region:{ name: "nanjing", phone: 025, address: { state: "jiangsu" } }, fallIn: function() { alert("fallIn"); }, fallOut: function() { alert("fallOut"); } }; </script> </head> <body> <script type="text/javascript"> alert("city:"+soldier.region.name + "---province:" + soldier.region.address.state); </script> </body> </html>
对象原型(prototype)
当给构造函数的prototype属性赋值时,它们会自动扩展到该类的所有实例。
用prototype属性为对象添加属性
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=windows-1250"> <meta name="generator" content="PSPad editor, www.pspad.com"> <title></title> <script type="text/javascript"> function Book(title, author) { this.title = title; this.author = author; } </script> </head> <body> <script type="text/javascript"> var book1 = new Book("book1", "author1"); var book2 = new Book("book2", "author2"); Book.prototype.publisher = "Jack"; document.write(book1.title+" is published by "+book1.publisher+"<br/>"); document.write(book2.title+" is published by "+book2.publisher); </script> </body> </html>
页面输出
book1 is published by Jack
book2 is published by Jack
注:添加新属性的方法同样适用于添加新方法。
原型查找链:js中获取对象的属性时,会先查看该属性是否直接定义在那个对象中,如果没有找到,则从prototype属性中寻找,如果还是没有,则向上查找父类对象,一直查到最顶层(Object),这样的过程叫做原型查找链。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=windows-1250"> <meta name="generator" content="PSPad editor, www.pspad.com"> <title></title> <script type="text/javascript"> function Book(title, author) { this.title = title; this.author = author; } </script> </head> <body> <script type="text/javascript"> var book1 = new Book("book1", "author1"); var book2 = new Book("book2", "author2"); Object.prototype.category = "Science"; Book.prototype.publisher = "Jack"; document.write(book1.title+" is published by "+book1.publisher + " and in the " + book1.category +"<br/>"); document.write(book2.title+" is published by "+book2.publisher + " and in the " + book1.category); </script> </body> </html>输出结果:
book1 is published by Jack and in the Science
book2 is published by Jack and in the Science
这个例子中向上查找的过程:Book中查找publisher->无->Book.prototype查找publisher->有->Book中查找category->无->Book.prototype查找category->无->Object->无->Object.prototype->找到
如果到Object.prototype仍未找到的话,则返回undefined
通过原型实现继承:
js中没有extends关键字,所以实现继承用的是原型的方式。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=windows-1250"> <meta name="generator" content="PSPad editor, www.pspad.com"> <title></title> <script type="text/javascript"> function A() { this.name="abc"; this.getName = function() { return this.name; }; } function B() {} //此处实现了B对A的继承 B.prototype = new A(); //B的构造函数赋值 B.prototype.constructor = B; //子类添加方法 B.prototype.speak = function () { alert("B is speaking"); } </script> </head> <body> <script type="text/javascript"> var Bobj = new B; Bobj.speak(); alert(Bobj.getName()); </script> </body> </html>结果:先弹出B is speaking再弹出abc