//1、创建对象 //缺点:创建很多个对象的时候会产生大量的代码 var person = new Object(); person.name = "Nicholas"; person.age = 24; person.job = "码农"; person.sayName = function () { alert(this.name); } //2、工厂模式 //通过接收参数来构建一个包含所有必要信息的对象,节省了很多代码 //缺点,没有解决对象识别的问题(对象的类型) function creatPerson(name, age, job) { var o = new Object(); o.name = name; o.age = age; o.job = job; o.sayName = function () { alert(this.name); } return o; } var person1 = creatPerson("Nicholas", 24, "码农"); var person2 = creatPerson("Greg", 24, "码农"); person1.sayName();//Nicholas person2.sayName();//Greg //3、构造函数模式 //和工厂模式不同的在于 //1、没有显示式的创建对象 //2、直接将属性和方法赋给了this对象 //3、没有reutrun语句 //缺点:构造函数的方法在每个实例上都要重新创建一遍 function Person(name, age, job) { this.name = name; this.age = age; this.job = job; this.sayName = function () { alert(this.name); } } var person3 = new Person("Nicholas", 24, "码农"); var person4 = new Person("Greg", 24, "码农"); person3.sayName();//Nicholas person4.sayName();//Greg alert(person3.sayName == person4.sayName);//false //创建Person的新实例,必须使用new操作符。以这种方式调用构造函数实际上会经历以下4个步骤 //1、创建一个新对象 //2、姜构造函数的作用与赋给新对象(因此this就指向了这个新对象) //3、执行构造函数中的代码(为这个新对象添加属性和方法) //4、返回新对象 //每个实例都有一个constructor(构造函数)属性,该属性指向构造函数 alert(person3.constructor == Person);//true alert(person4.constructor == Person);//true //将构造函数当作一个普通函数来使用 Person("Tom", 27, "码农"); window.sayName();//Tom var o = new Object(); Person.call(o, "Kittey", 25, "码农");//apply方法也可以 o.sayName();//Kittey