js的一些学习笔记2

来源:互联网 发布:阿里先锋软件 编辑:程序博客网 时间:2024/05/15 04:41

js面向(基于)对象编程

1.js面向对象编程:类与对象:

javascript中没有class,但是它取了一个新名字叫原型对象,相当于Java中类的概念,所以有时候称为类也可以。

例子:

//定义一个cat 类。function cat(){}var cat1 =new cat();//创建该类cat1.name="jack";cat1.color="black";cat1.age=3;//js中的对象属性可以动态增加//属性没有限制


创建对象的方式:

a.使用构造函数来定义类;

b.使用prototype;

c.使用new object创建对象并添加相关属性

d.构造函数及原型混合方式;

e.动态原型的方式;


先使用使用构造函数来定义类,然后再创建对象实例

基本语法:

function 类名 (){

}

创建对象:

var 对象名 =new 类名  ();


如何判断一个类是否为已知类:

function a(){}var a1 =new a();window.alert(a1.constructor);window.alert(typeof a1);if(a1 instanceof a){window.alert("a1 is a ok1");}if(a1.constructor==a){window.alert("a1 is a ok2");}

通过一个例子来说明变量带var 和不带var 的区别:

var abc =89;function test(){abc = 900;}test();window.alert(abc);


2.访问对象属性的方法:

(1).普通方式:

对象名.属性名

(2)动态访问:

对象名["属性名"];

一个例子:

function Person(){}var  p1 = new Person();p1.name = "abc";window.alert(p1.name);window.alert(p1["name"]);


3.js的对象回收机制(GC):

js引擎(在浏览器中)管理内存,通过一张表来管理内存:

堆地址引用次数0x123420x23540
把引用次数为0的内存空间给回收;

或者用delete主动直接删除某个对象的属性: delete 对象名.属性( delete a.age)


4.this

this 的提出:

当我们创建某些对象的时候,希望对象自动拥有某些属性,这时使用this可以解决这个问题


function Person(){this.age=10;//这个属性是公有的this.name="abc";//公有属性}var a= new Person();var b= new Person();b.name="cde";window.alert(a.name+" "+b.name);

在定义初始变量的时候,不能出现以下的方式:

function Person(){var age=10;//这个属性是私有的var name="abc";//这个属性是私有的}var a= new Person();var b= new Person();b.name="cde";window.alert(a.name+" "+b.name);


可以通过this 构成一个共有的方法来访问私有的变量,如以下的例子:

function Person(){var age=10;var name="abc";this.show=function(){//这是Person类的一个公开的方法,用来访问私有属性window.alert(age+" "+name);}function show2(){//这是Person类的一个私有方法,只能在Person内部使用window.alert("show2()"+name+age);}}var a= new Person();a.show();

this的另一个例子:

function test1(){alert(this.v);}var v=9;test1();//或使用window.test1();   不给出对象的默认是window对象

输出结果为 9;谁调用带有this的函数,就可以把它替换this

5.构造函数,成员函数:

给一个对象指定函数的方法:

①:

function Person(){//传入的实际参数,达到初始化属性的作用this.name= "kevin" ;this.age = 90;this.show=function(){//输出自己的名字, 这里的this.show 是一个公开的函数,函数名是showwindow.alert("名字"+this.name+this.age);}}var p1 = new Person();p1.show();

②:

function Person(){//传入的实际参数,达到初始化属性的作用this.name= "kevin" ;this.age = 90;}function show(){window.alert("hello"+this.name);}var p1 = new Person();p1.kevin = show;// 把show这个函数指向Kevin中文属性p1.kevin();

③:

function Person(){//传入的实际参数,达到初始化属性的作用this.name= "kevin" ;this.age = 90;}var p1 = new Person();p1.kevin = function show(){window.alert("hello"+this.name);}p1.kevin();

其实这三个方法本质上是一样的,但在使用这些方法的时候,每个对象所具有的属性是不共享的,即创建每个对象的时候都会产生每一部分的代码,若要共享一部分代码则可以用prototype,如:

function Dog(){}Dog.prototype.shout=function(){//使用prototype类去绑定一个函数给shout这个属性window.alert("ok");}var dog1 = new Dog();dog1.shout();var dog2 = new Dog();dog2.shout();

如果要判断两个对象或函数的地址是否相同,可以通过 == 进行判断.


成员函数的细节:

1.成员函数的参数可以是多个的

function 函数名 (参数1,参数2,...){

...

}

2.成员函数可以有返回值,也可以没有,有的话只能有一个

3.js 中没有函数重载这个概念,即在以相同和名字命名两个函数时,最后一个函数的函数体会覆盖之前所有函数体:

function test(a){window.alert(a);}function test(a,b){window.alert(a+" "+b);}//这个函数是全局函数,属于window 类test(10);   //输出 10 undefined test(10,20);//输出 10 20













0 0