工厂函数与构造函数的区别:
            1.工厂函数没有使用this;
            2.工厂函数首字母小写;
            3.没有用NEW
            4.有return;

tips:构造函数里的方法很占内存,没创建一个实例,就创建一个不同的方法对象。
    eg:    /*
            空对象,Object是所有对象的祖先
            比如:学生继承人类,人类就会继承Object
        */
        var obj = new Object();
        console.info(obj);

        /*
            js可以动态的添加属性
        */
        obj.name = "flash boy";
        console.info(obj);

        /*
            工厂函数:
            他跟构造函数的区别:
                    1.首字母小写
                    2.函数中没有使用this
                    3.使用的时候没有用new
        */
        //工厂函数
        function createPerson(name) {
            var o = new Object();
            o.name = name;
            return o;            //o这个变量存了一个地址,把地址返回给p
        }

                        //没有用new,因为它不是构造函数
        var p = createPerson("洋洋");
        console.info(p);

        //构造函数
        function Student(name) {
            this.name = name;
        }



构造原型方式(套路):
    //创建类
        //1.属性全部放在构造函数里面
        //2.方法写在外面(prototype)
    eg:
        function Student(name) {
            this.name = name;
        }
        Student.prototype.study = function() {
            console.info(this.name + "惊呼:好好学习,天天向上");
        }

        var stu = new Student("洋洋");
        stu.study();


        var stu = new Student("张三");


原型模式:
    我们创建的每个函数都有一个prototype属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定
    类型的所有实例共享的属性和方法。

    tips:原型的方法是用的同一个方法(构造函数用的是不同方法),所以比较省内存。
    eg:
        function Person() {

        }
        //运行完以上代码后,相当于执行了一个Person.prototype = new Object();

        /*
            prototype是Person函数对象的属性,
            它指向了一个对象(就是一个引用),
            它指向的这个对象中的所有的属性跟方法,是每个实例所公用。
        */
        Person.prototype.name = "刘星星";
        Person.prototype.age = 18;

        var p1 = new Person();
        var p2 = new Person();

        console.info(p1.name);
        console.info(p2.name);
        console.info(p2.age);
        /*
            我们创建的每一个函数都有一个prototype属性,这个属性是一个指针,
            指向一个对象,而这个对象的用途是包含可以由特定类型的所有实例共
            享的属性和方法。
        */

原型链:
    1 . 普通对象都有_proto_;
    2 . 函数都有prototype(原型对象);
    3 . _proto_来自于函数的prototype;
    4 . 如果自己没有该属性,折沿着_proto_往上找。    
    eg:
        //父亲
        function Father(name) {
            this.fatherName = name;
        }
        Father.prototype.age = 18;

        var ft = new Father("父亲");
        console.info(ft.age);
        console.info(ft.fatherName);

        //儿子
        function Son(name) {
            this.sonName = name;
        }
        Son.prototype = new Father();

        //每一个对象的_proto_都来自于构造函数的prototype属性
        var sn = new Son("儿子");
        console.info(sn.age);
        console.info(sn);

原型链继承:
    eg:
        //继承的好处是:复用代码
        //让相应的对象之间的直接产生关系
        function Person(name) {
            this.name = name;
            this.sleep = function() {

            }

posted on 2016-04-27 21:31  汉时关  阅读(112)  评论(0编辑  收藏  举报