JavaScript中创建对象的4种方式:
第一种:工厂模式
第二种:构造函数模式
第三种:原型模式
第四种: 构造函数+原型模式(构造函数中声明属性,原型对象中处理函数)
//(1)工厂模式 function createPerson(name,age,gender) { var o = new Object(); o.name = name; o.age = age; o.gender = gender; o.sayName = function () { alert('hello'); }; return o; } var val = createPerson('joy',23,'female'); console.log(val); console.log(typeof val); var val1 = createPerson('lpen',27,'male'); console.log(val1); console.log(typeof val1); //缺点:无法识别对象类型,即所有对象都是object //(2)构造函数模式 var run = function () { alert('hhh'); } function Person(name,age,gender) { this.name = name; this.age = age; this.gender = gender; this.run = run; }; var person = new Person('lpen',27,'male'); console.log(person); console.log(typeof person); function Dog(name,age,gender) { this.name = name; this.age = age; this.gender = gender; this.run = run; }; var dog = new Dog('xiaohua',2,'female'); console.log(dog); console.log(typeof dog); console.log(person.run == dog.run); //使用new调用构造函数创建一个对象 //1.创建一个对象 //2.将构造函数的作用域赋给新对象 //3.执行构造函数中的代码 //4.返回新对象 //问题:(1)每个方法都需要在每个实例上创建一遍,其实没有必要。可以在全局范围中声明一个函数,将该函数的引用传递 //给对象的函数属性,但是这样会导致全局函数太多,体现不了封装性 //(3)原型模式 function Person() { } Person.prototype.name = 'joy'; Person.prototype.age = 23; Person.prototype.gender = 'female'; Person.prototype.say = function () { alert('hello'); } var p1 = new Person(); p1.name = 'lpen'; console.log(p1); var p2 = new Person(); console.log(p2); //构造函数+原型模式(构造函数中声明属性,原型对象中处理方法) function Person(name,age,gender) { this.name = name; this.age = age; this.gender = gender; } Person.prototype.say = function () { alert('say'); }; Person.prototype.run = function () { alert('run'); } var p1 = new Person('joy',23,'female'); console.log(p1); p1.say(); p1.run();