创建对象

xiaoxiao2021-02-28  98

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); //false alert(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、稳妥构造函数模式

转载请注明原文地址: https://www.6miu.com/read-84176.html

最新回复(0)