对象是具体的,类是抽象的如何理解

168 阅读1分钟

1.function a(){}

该方法的定义是全局性的,就算在调用之后定义,系统也不会报错,可以理解为,系统在执行到该方法时再去找该方法的定义位置进行初始化。存在变量提升问题

2.var a=function(){}

匿名函数的定义方法,若是在定义之前调用了,系统会报错。可以理解为,只用运行到这个方法时才能对变量a进行初始化,若是没有对变量a初始化,则会报错。此时,a代表后面匿名函数的返回值。

详细分析:案例一:

var ManA = function(name,tel){
    this.name = name;
    this.tel = tel;
    var sex = "男";
}
console.log(ManA())  undefined 

详细分析:案例二:

var ManB = function(name,tel){
    var name = name;
    var tel = tel;
    var sex = "男";
}
console.log(ManB())  打印对象 

你有没有注意到Man里面name变量前面加了this,如果定义变量的时候前面加了this,就说明这个变量是Man的公共变量,注意不是全局变量,公共变量是指通过Man的实例可以进行读写的变量。function内部定义的时候如果定义变量或者函数前面加了this,基本可以确定这是一个类,类是不能直接使用的,我们需要实例化(new) 那么我们如何使用函数构造对象:

function makeClass(){
            return function(args){
                console.log(args,arguments)
                if ( this instanceof arguments.callee ) {
                    if ( typeof this.init == "function" ){
                        this.init.apply( this, args.callee ? args : arguments );
                    } 
                } else {
                    return new arguments.callee( arguments );
                }
            };
        }
    var User = makeClass();
    User.prototype.init = function(first, last){
        this.name = first + " " + last;
    };
    var user = User("John", "Resig");