js12---闭包,原型,继承

<html>
<body>
<script type="text/javascript">
//闭包实现了函数层面多个子函数共享父类函数的属性、方法(继承)。类层面上原型实现了多个子类对象共享父类对象的属性、方法(继承)。
//函数每调用一次,就会开启一个新的内存区域让函数执行。类的成员方法也是,每调用一次就开辟一个新的内存区域。
function f1(){
    var b = 1;
    var c = function(){alert(123);}
    return function(g){
        b++;
        if(g == 0){
            c = function(){alert(b);alert(456);}
        }
        c();
    }
}

var d1 = f1();//大函数return函数模版,函数模版多次执行时地址不一样,
alert("===");
d1(1);//123
alert("---");
d1(0);//3  456,改变了大函数的c
alert("+++");
d1(1);//4  456,使用改变了的c

var d2 = f1();//大函数return函数模版,函数模版多次执行时地址不一样,
alert("===");
d2(1);//123
alert("---");
d2(0);//3  456,改变了大函数的c
alert("+++");
d2(1);//4  456,使用改变了的c
</script>
</body>
</html>
        var cat = (function(){//函数嵌套,就是类中类,
            //私有静态属性
            var AGE = 10;
            //私有函数
            function add(x,y){
                return x+y;
            }
            return function(){
                //多个子类,使用外层闭包的公有的属性和方法
                this.age = ++AGE;
                this.add = function(x,y){
                    //alert(age);//age is not defined
                    return add(x,y)
                }
                this.setAge = function(age){
                    AGE = age;
                }
            }
        })()
        alert(new cat().add(1,2));//3,new的时候函数会执行一次
        alert(new cat().age);//12
        new cat().setAge(100);
        alert(new cat().age);//101
function Person(name , age){
            this.name = name ; 
            this.age  = age ; 
            this.sayName = function(){alert('我是姓名!')};//sayName指的是函数模型,不同对象的成员方法执行都会开辟新内存区域,
        }
var p1 = new Person('z3',20);
var p2 = new Person('z4',21);
alert(p1.sayName == p2.sayName);     // false 

 var定义的属性和方法相当于是私有的属性和方法,不同函数对象的方法的地址是不一样的。