创建对象

来源:互联网 发布:java pdf转换html代码 编辑:程序博客网 时间:2024/06/09 15:08

1、工厂模式
缺点:解决不了对象识别问题(即怎样知道一个对象的类型)。

function createPerson(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 = createPerson("Nicholas", 29, "Software Engineer");var person2 = createPerson("Greg", 27, "Doctor");

2、构造函数模式
缺点:每个方法都要在每个实例上重新创建一遍。
调用构造函数实际上会经历以下 4个步骤:
(1) 创建一个新对象;
(2) 将构造函数的作用域赋给新对象(因此 this 就指向了这个新对象);
(3) 执行构造函数中的代码(为这个新对象添加属性);
(4) 返回新对象。

function Person(name, age, job){this.name = name;this.age = age;this.job = job;this.sayName = function(){alert(this.name);};}var person1 = new Person("Nicholas", 29, "Software Engineer");var person2 = new Person("Greg", 27, "Doctor");

2、原型模式
缺点:
1、没有为构造函数初始化的过程,默认情况下实例都是相同的属性值。
2、对于包含引用类型值的属性来说,一个实例修改了这个属性,另外一个实例的这个属性也被修改。
创建一个新函数,会为它创建一个prototype指向原型对象,原型对象的constructor会指向prototype属性所在的指针。

function Person(){}Person.prototype.name = "Nicholas";Person.prototype.age = 29;Person.prototype.job = "Software Engineer";Person.prototype.sayName = function(){alert(this.name);};var person1 = new Person();person1.sayName(); //"Nicholas"var person2 = new Person();person2.sayName(); //"Nicholas"alert(person1.sayName == person2.sayName); //true

3、组合使用构造函数模式和原型模式
缺点:有其他 OO 语言经验的开发人员在看到独立的构造函数和原型时,很可能会感到非常困惑。
但这种构造函数与原型混成的模式,是目前在 ECMAScript 中使用最广泛、认同度最高的一种创建自定义类型的方法。可以说,这是用来定义引用类型的一种默认模式。
实例属性都是在构造函数中定义的,而由所有实例共享的属性 constructor 和方法 sayName()则是在原型中定义的。

function Person(name, age, job){this.name = name;this.age = age;this.job = job;this.friends = ["Shelby", "Court"];}Person.prototype = {constructor : Person,sayName : function(){alert(this.name);}}var person1 = new Person("Nicholas", 29, "Software Engineer");var person2 = new Person("Greg", 27, "Doctor");person1.friends.push("Van");alert(person1.friends); //"Shelby,Count,Van"alert(person2.friends); //"Shelby,Count"alert(person1.friends === person2.friends); //falsealert(person1.sayName === person2.sayName); //true

4、动态原型模式
动态原型模式正是致力于解决其他 OO 语言经验的开发人员在看到独立的构造函数和原型时,很可能会感到非常困惑的一个方案,它把所有信息都封装在了构造函数中,而通过在构造函数中初始化原型(仅在必要的情况下),又保持了同时使用构造函数和原型的优点。换句话说,可以通过检查某个应该存在的方法是否有效,来决定是否需要初始化原型,这里只在 sayName()方法不存在的情况下,才会将它添加到原型中。

function Person(name, age, job){//属性this.name = name;this.age = age;this.job = job;//方法if (typeof this.sayName != "function"){Person.prototype.sayName = function(){alert(this.name);};}}var friend = new Person("Nicholas", 29, "Software Engineer");friend.sayName();

4、寄生构造函数模式

5、稳妥构造函数模式