本文是金旭亮老师网易云课堂的课程笔记,记录下来,以供备忘。
我们可以编写一个函数,此函数的功能就是创建对象,可将其称为“对象工厂方法”。
 1    //工厂函数 2         function createPerson(name, age, job) { 3             var o = new Object(); 4             o.name = name; 5             o.age = age; 6             o.job = job; 7             o.sayName = function () { 8                 console.info(this.name); 9             };10             return o;11         }12         //使用工厂函数创建对象13         var person1 = createPerson('张三', 29, '软件工程师');14         var person2 = createPerson('李四', 40, '医生');       //定义对象“构造”函数        function Person(name, age, job) {            this.name = name;            this.age = age;            this.job = job;            this.sayName = function () {                console.info(this.name);            };        }        //使用new调用对象构造函数创建对象        var p1 = new Person('张三', 29, '软件工程师');        var p2 = new Person('李四', 40, '医生');构造函数其实也是一个函数,不同之处在于调用它时必须要加一个“new”关键字,如果不加这个关键字,则对它的调用被认为是普通函数调用。
1 //作为普通函数调用的构造函数,通过this添加的属性,2 //成为了window对象的属性与方法。3 console.info(window.name);//张三4 console.info(window.age); //295 console.info(window.job); //软件工程师
对象构造函数长得这个样:
1 function Person (name) {2      this.name = name;3      this.say = function () {4          return "I am " + this.name;5      };6 }实际上是这样(示意):
1 function Person (name) {2       // var this = {};3       this.name = name;4       this.say = function () {5            return "I am " + this.name;6      };7       // return this;8 }a).使用对象工厂函数创建对象,每个对象的constructor属性引用Object()
1       var person = createPerson('张三', 29, '软件工程师');2 3      //使用工厂方法创建对象,其constructor属性引用Object()函数4         console.info(person1.constructor === Object);  //trueb).使用对象构造函数创建对象,每个对象的constructor属性引用这个构造函数
1 var p = new Person('张三', 29, '软件工程师');2 //使用对象构造函数创建对象,3 //每个对象的constructor属性,引用这个构造函数4 console.info(p.constructor === Person); //true可以使用arguments.callee解决这个问题
 1         //了解arguments.callee的作用 2         function TestArgumentsCallee() { 3             console.info(this); 4             console.info(this instanceof TestArgumentsCallee); 5             console.info(this instanceof arguments.callee); 6         }; 7         TestArgumentsCallee(); //window 8                                             //false 9                                             //false10         new TestArgumentsCallee();  //TestArgumentsCallee11                                                      //true12                                                      //true于是,可以直接用arguments.callee
 1         //避免忘记new 2         function MyObject(value) { 3             if (!(this instanceof arguments.callee)) { 4                 //如果调用者忘记加上new了,就加上new再调用一次 5                 return new MyObject(value); 6             } 7             this.PRop = value; 8         } 9         //测试10         var obj1 = new MyObject(100);11         console.info(obj1.prop);//10012         var obj2 = MyObject(200);13         console.info(obj2.prop); //200新闻热点
疑难解答