Home »  JavaScript » 函数和面向对象

面向对象

定义:

对象是由 new 运算符加上要实例化的对象的名字创建的。例如,下面的代码创建 Object 对象的实例:

var obj = new Object();
alert(typeof obj); //object
alert(typeof Object); //function

constructor

对创建对象的函数的引用(指针)。对于 Object 对象,该指针指向原始的 Object() 函数。

prototype

对该对象的对象原型的引用。对于所有的对象,它默认返回 Object 对象的一个实例。 Object 对象还具有几个方法:

hasOwnProperty(property)

判断对象是否有某个特定的属性。必须用字符串指定该属性。(例如,o.hasOwnProperty("name"))

isPrototypeOf(object)

判断该对象是否为另一个对象的原型。

propertyIsEnumerable(property)

判断给定的属性是否可以用 for...in 语句进行枚举。

toString()

返回对象的原始字符串表示。对于 Object 对象,ECMA-262 没有定义这个值,所以不同的 ECMAScript 实现具有不同的值。

valueOf()

返回最适合该对象的原始值。对于许多对象,该方法返回的值都与 ToString() 的返回值相同。

Object 对象中的所有属性和方法都会出现在其他对象中,所以理解了 Object 对象,就可以更好地理解其他对象。

>javascript 中所有对象已经自动被做了引用

所有的全局函数都是 Global 对象中的方法,

// Global.isNaN(); 
// 不用明确指定
isNan();

函数创建:

在javascript中函数就是类

//第一种方式
function fn1()
{
    alert('test1');
}

//第二种方式 匿名函数,一个表达式
var n = function() {};

函数表达式

a=function(b){};
a(b);
//等同于
(function(b){})(b) //匿名函数立即执行

直到函数真正运行后才能调用

函数参数:

function fun2()
{
    //arguments对象,是一个数组,可以解析出参数
    alert(arguments[1]);

    for (var i = 0; i<arguments.length; i++) {
        alert(arguments[i]);
    }
}

fun2(1,2,3);

函数递归:

//算出n的阶乘
function digui(n) {
    return n ? n*digui(n-1) : 1;
}
//另一种写法
//arguments.callee 调用自身
function digui(n) {
    return n ? n*arguments.callee(n-1) : 1;
}

digui(2);

函数的属性:

function fun4(a, b, c) {
    
}
//length 属性
fun4.length

//caller属性 必须在函数内部调用,读取谁调用了我

function func5() {
    alert(arguments.callee.caller); 
}

function fun6() {
    func5();
}

fun6(); //输出 函数fun6,因为 fun6调用了它

函数的闭包:

不被计算的变量函数,也就是说,函数可以使用函数之外使用的变量

//一个简单的闭包
var ms = '我是全局变量';
function msg()
{
    alert(ms);
}
msg();

函数的嵌套

function test1() {
    function test2() {
        alert('外面访问不到我');
    }    
}
test2(); 报错;可以理解为局部变量
//复杂的闭包调用
function each() {
    var i = 0;
    for (; i < 10; i++) {}
    function inner() {alert(i);}
    return inner;
}

var fn = each();
fn(); //10

//闭包内存泄露写法

function each() {
    var i = 0, inner, a = [];
    for (; i < 10 ; i++) {
        //注意这里调用10次cache()
        cache(i);
    }

    function cache(abc) {
        a.push(function(){
            alert(abc);
        });
    }

    return a;
}
//比较好的写法
function each() {
    var i = 0;a=[];
    for(;i<10;i++) {
        a.push(function() {alert(i);});
    }
    return a;
}

//一大好处,暂存之后再处理,见一下代码实例

function fntest(num1, num2) {
    return function() {
        //复杂的计算
        alert("num1+num2结果为" +  (num1+num2));
    }
}
//这里保存下来
var result = fnTest(23, 24);

var a = false;
//经过很多处理来更改a的值。。。。。。。


//我用它的时候再进行调用,不用的时候不调用
if (a) {
    result();    
}

对象:

var fun = function fun1() {
}

alert(fun); //function

//可以理解为构造函数
alert(new fun()); //object 变成了对象
//构造函数特点
//不要使用 return

所有全局变量都是window对象的属性

function demo(name, age) {
    this.name = name;
    this.age=age;
    alert(this);
}

demo(); //this指向window
new demo() //自动创建一个对象,this指向本对象

var obj = {};
obj.name = "mtao";
obj.method = demo;
obj.method(); //this执行obj对象

对象继承:

构造函数A的prototype属性是一个对象 这个对象具有的所有属性,A的实例也具有

function Demo() {};
var d = new Demo();
// Demo.prototype={
//     name: 'mtao'
// };
// alert(d.name); //undefined
Demo.prototype.name = 'mtao';
alert(d.name); //mtao

简单继承

function fun1()
{
    this.name = 'mtao';
}

function fun2()
{

}
fun2.prototype = new fun1();
var fun = new fun2();
alert(fun.name); //mtao

改变this指针

function fun1()
{
    this.name = 'mtao';
}
var o = {};
o.fun = fun1;
o.fun();
alert(o.name);

等同于

//这里用call 方法写
function fun1(a, b) {
    this.name = 'mtao';
}
var o = {};
fun1.call(o, '1', '2');
//call(this指向的对象,...函数的参数)
fun1.apply(o, [1,2]);
//apply(this指向的对象,...数组参数)

alert(o.name);
//object 是所有类的根,是最基本的对象
alert(Demo instanceof Object);
// Array
// String
// Number
// Boolean
//RegExp
//它们都是Object对象的子类

Object.prototype.name = "mtao";
alert([].name);
alert('sdf'.name);
alert(/a/.name);
//它们都自动具有了name属性

//给String对象加了一个trim方法
String.prototype.trim = function()
{
    return this.replace(/^\s+/, '').replace(/\s+$/, '');
}

var x = ' sd dfg   ';
alert('|'+x.trim()+'|');


//arguments 继承数组join方法
function msg() {
    //用call来调用
    alert([].join.call(arguments, '\n'));    
}
msg('adf', 12, 32, 14);

函数方法覆盖

var fn = new Object();
Object.prototype.toString = function() {
    alert('ddd');
};
alert("" + fn);
var str = new String();
alert(str instanceof String);
var a = [];
alert(a instanceof Array); //判断是不是数组构造函数的
//isPrototypeOf 判断prototype是不是某个对象的
alert

面向对象特性在js中运用:

封装

>相关的信息存储在对象的能力

//闭包模拟私有
function demo(name, age)
{
    this.name = name;
    this.age = age;
    this.getName = function()
    {
        return name;
    };

    this.getAge = function()
    {
        return age;
    };
    this.setName = function(n)
    {
        name=n;
    };
    this.setAge = function(a)
    {
        age=a;
    };
}

聚集

把一个对象存储在另一个对象的能力

继承

>由另一个类得来类的属性和方法的能力

多态

>编写能以多种方法运行的函数或方法的能力

//arguments 运用

...................................