JS面向(基于)对象编程
1. 澄清概念
JS中基于对象等同于面向对象
JS中没有class,但是有新的名字叫做原型对象,因此类等同于原型对象 2. 为什么需要面向对象
入门案例:
/*张老太太养了两只猫猫:一只名字叫小白,今年3岁,白色。 还有一只叫小花,今年10岁,花色。请编写一个程序,当用户 输入小猫的名字时,就显示该猫的名字,年龄,颜色。如果用 户输入的小猫名字错误,则显示张老太太没有这只猫。 */
//这里就是一个Cat类 function Cat(){ }
var cat1=new Cat();//这时cat1就是一个对象 cat1.name=\小白\cat1.age=3;
cat1.color=\白色\
//从上面的代码我们可以看出
//1.JS中的对象的属性可以动态的添加 //2.属性没有限制
window.alert(cat1.name);输出小白
类(原型对象)和对象的区别和联系 1) 类是抽象的概念,代表一类事物 2) 对象是具体的,代表一类实体
3) 对象是以类(原型对象)为模板创建起来的
创建对象的方式有5种
1) 工厂方法—使用new Object创建对象并添加相关属性 2) 使用构造函数来定义类(原型对象) 3) 使用prototype
4) 构造函数及原型混合方式 5) 动态原型方式
方法选择:使用构造函数来定义类(原型对象),然后再创建实例
基本语法:
function 类名/原型对象名(){ }
创建对象:var 对象名=new 类名(); 在对象中我们特别说明: 1) JS中一切都是对象
function Person(){}
window.alert(Person.constructor); var a=new Person();
window.alert(a.constructor);//对象实例的构造函数 window.alert(typeof a);//a的类型是什么 var b=123;
window.alert(b.constructor); 输出:
如何判断一个对象实例是不是某个类型 方法1:
if(a instanceof Person){
window.alert(\是Person\}
方法2:
if(a.constructor==Person){ window.alert(\是Person\}
补充说明:带var和不带var的区别 var abc=89;//全局变量 function test(){ abc=900; }
test();
window.alert(abc); //输出900,var abc=900;则输出89
访问对象的属性的方法:2种 1) 普通方式:对象名.属性名 2) 动态访问:对象名[“属性名”] 案例:
1.function Person(){} var p1=new Person(); p1.name=\姜爽\
window.alert(p1.name); var val=\
window.alert(p1[\window.alert(p1[val]);
对象的引用问题说明: 2.function Person(){} var a=new Person(); a.age=10;
a.name=\小明\var b=a;
b.name=\小白\
window.alert(b.age+\名字\名字\输出:10名字小白名字小白 对象回收的机制: GC
JS引擎(浏览器的部分)有一张表
堆地址 引用的次数
0x1234 2 b=null 1
a=null ->0
JS提供一种方式主动释放内存
delete a.age;//用于删除属性 指向同一个地方,一个删了b就访问不到了 这样就会立即释放对象的属性空间
this讲解: 问题的提出:
function Person(){}; var p1=new Person(); p1.name = \老韩\p1.age = 30;
window.alert(p1.name+\var p2 = new Person(); window.alert(p2.name);
这里我们可以看到 window.alert(p2.name)会输出 undefined
在实际编程中,我们可能有这样的需求,当我们创建一个对象后,就希望该对象自动的拥有某些属性
[比如:当我们创建一个Person对象后,就希望该对象自动拥有name和age属性,这又怎么办?
使用this 来解决 function Person(){ this.name=\ this.age=30; }
var p1 = new Person(); var p2 = new Person();
window.alert(p1.name+\
◇可能有人会这样去思考问题 //***有些同学可能会这么想: function Person(){
var name=\如果这样去使用name这个属性是私有的 var age=30;
this.name2=\表示name2这个属性是公开的 }
var p1=new Person();
window.alert(p1.name+\错误
这样使用会报 undefined,私有的外部访问不到
function Person(){
var name=\私有的,只能在内部使用 var age=30;//私有的,只能在内部使用
this.name2=\表示name2这个属性是公开的
this.show=function (){//函数 这就是Person类里面的一个公开的方法 window.alert(\}
function show2(){//这就是Person类里面的一个私有的方法,只能在类内部使用, //如要一定要使用,只能通过公开方法(特权方法)来调用私有方法来实现 window.alert(\ } }
var p1=new Person(); p1.show();
//p1.show2();//这里会报错
//window.alert(p1.name+\错误的
记住一句话:
哪个对象实例调用this所有的函数,那么this就代表哪个对象实例 function test1(){ alert(this.v); }
var v=90;
window.test1();//等价于test1() window调用test1(),所以this就代表window 输出90
this注意事项:
this不能放在类的外部使用,否则调用就变成window调用了
对象---成员函数(方法)
比如我们希望对象不但有属性,还需要他有行为,行为在程序中要靠函数来体现。 function Person(name,age){
//使用传递的实际参数去初始化属性 this.name=name; this.age=age;
//输出自己的名字,这里this.show就是一个公开的函数,函数名字是show this.show=function(){
document.write(\名字\}
//添加计算函数,可以计算从1+....+100的结果 this.jisuan=function(n){ var res=0;
for(var i=1;i<=n;i++){ res+=i; }
return res; } }