01.工厂函数和构造函数

2019-06-06  本文已影响0人  Fl_来看看

1.什么是工厂函数?

工厂函数就是专门用于创建对象的函数, 我们就称之为工厂函数

2.有什么用?

先看不用工厂函数创造对象的做法

 let obj1 = {
            name: "lnj",
            age: 33,
            say: function () {
                console.log("hello world");
            }
        };
        let obj2 = {
            name: "zs",
            age: 44,
            say: function () {
                console.log("hello world");
            }
        };

这样子批量创造对象简直要命!
运用工厂函数后:

function createPerson(myName, myAge) {
           let obj = new Object();
            obj.name = myName;
            obj.age = myAge;
            obj.say = function () {
                console.log("hello world");
            }
            return obj;
        }
        let obj1 = createPerson("lnj", 34);
        let obj2 = createPerson("zs", 44);
        console.log(obj1);
        console.log(obj2);

注意看流程
工厂函数没有用this的,最后还要返回一个object

1.什么是构造函数
构造函数和工厂函数一样, 都是专门用于创建对象的,构造函数本质上是工厂函数的简写

  function Person(myName, myAge) {
            // let obj = new Object();  // 系统自动添加的
            // let this = obj; // 系统自动添加的
            this.name = myName;
            this.age = myAge;
            this.say = function () {
                console.log("hello world");
            }
            // return this; // 系统自动添加的
        }

1.当我们new Person("abc", 34);系统做了什么事情
- 会在构造函数中自动创建一个对象
- 会自动将刚才创建的对象赋值给this
- 会在构造函数的最后自动添加return this;

上面那样写,其实有性能问题的,有什么性能问题?由于两个对象中的say方法的实现都是一样的, 但是保存到了不同的存储空间中

可以用Person.prototype 保存实例共用的东西,节省内存

 function Person(myName, myAge) {
            // let obj = new Object();  // 系统自动添加的
            // let this = obj; // 系统自动添加的
            this.name = myName;
            this.age = myAge;
            // this.say = fns.mySay;
            // return this; // 系统自动添加的
        }
        Person.prototype = {
            say: function () {
                console.log("hello world");
            }
        }
        let obj1 = new Person("lnj", 34);
        obj1.say();
        let obj2 = new Person("zs", 44);
        obj2.say();
        console.log(obj1.say === obj2.say); // true

关于prototype 见下篇。

上一篇下一篇

猜你喜欢

热点阅读