本文详细解析JavaScript中创建对象的六种主要模式,包括基本模式、工厂模式、构造函数模式、原型模式、组合模式及动态原型模式。通过对比各模式的优缺点,如内存占用、实例关联性及参数传递能力,帮助开发者根据实际需求选择最合适的对象创建方式,并解析jQuery等库常用的组合模式原理。
JavaScript对象创建模式概览
在JavaScript中,创建对象的方式主要包含六种:基本模式、工厂模式、构造函数模式、原型模式、组合模式以及动态原型模式。下文将逐一解析这几种模式的具体实现方式。
基本模式与工厂模式
一、基本模式
var person = new Object();
person.name = "孙悟空";
person.weapon = "棒子";
person.run = function () { return this.name + "武器是" + person.weapon;
}
二、工厂模式
function creatPerson(name, weapon) { var person = new Object();
person.name = "孙悟空";
person.weapon = "棒子";
person.run = function () { return this.name + "武器是" + person.weapon;
} return person;
}
该模式存在以下局限性:1. 实例之间缺乏关联;2. 未使用new关键字;3. 造成资源浪费,每次生成实例时都会产生重复内容。关于第3点,其含义是:在多次调用creatPerson方法时,每个对象都会生成独立的run方法。尽管这些方法的功能完全一致,但它们占据了不同的内存空间,导致资源冗余。
构造函数模式解决了多个实例之间缺乏关联的问题,此时可以使用instanceof运算符来判断实例与构造函数的关系。
构造函数模式及其局限
三、构造函数模式
function creatPerson(name, weapon) { this.name = name; this.weapon = weapon; this.run = function () { return this.name + "武器是" + this.weapon;
}
} //调用创建对象
var wukou =new creatPerson("孙悟空", "棒子");
该模式未能解决工厂模式中内存浪费的问题,因为每创建一个对象都会增加大量重复的方法定义。针对这一缺陷,下文将介绍原型模式。
原型模式与组合模式
四、原型(Prototype)模式
JavaScript规定,每个构造函数都拥有一个prototype属性,该属性指向另一个对象。这个对象的所有属性和方法都会被构造函数的实例所继承。因此,可以将那些不变的属性和方法直接定义在prototype对象上,以实现共享。
function personObj() { }
personObj.prototype.name = "孙悟空";
personObj.prototype.weapon = "棒子";
personObj.prototype.run = function () { return this.name + "武器是" + this.weapon;
} //创建对象
var person = new personObj(); //原型模式的另一种写法 function personObj() { }
personObj.prototype = {
constructor: personObj,//强制指回personObj
name: "孙悟空",
weapon: "棒子",
run: function () { return this.name + "武器是" + this.weapon;
}
}
该模式的缺点在于:构造函数无法接收参数,因此不能通过参数初始化值。虽然不同对象可以共享方法,但属性无法共享。为了解决这一问题,下文将介绍结合构造函数和原型模式的组合模式,该模式解决了前述所有缺点,jQuery库即采用此方法。
五、组合模式
通过这种模式,不同的实例可以拥有各自特有的属性,同时共享相同的方法。
function personObj(name,weapon) { this.name = name; this.weapon = weapon;
}
personObj.prototype = {
run: function () { return this.name + "武器是" + this.weapon;
}
} //创建对象
var wukou = new personObj("孙悟空", "棒子");
虽然这种创建对象的方式已能满足日常使用需求,平时使用这种方式通常没有问题,但仍存在一个小瑕疵:对象中的属性和方法是分离定义的。下文将介绍动态原型方法以优化这一点。
动态原型模式
六、动态原型模式
function personObj(name, weapon) { this.name = name this.weapon = weapon if (typeof this.run != "function")
{
personObj.prototype = {
run: function () { return this.name + "武器是" + this.weapon;
}
}
}
}
//创建对象
var wukou = new personObj("孙悟空", "棒子");
函数中使用了 if (typeof this.run != "function"),其目的是为了防止在创建多个对象时,方法被重复执行多次,从而优化性能。
以上所述是小编给大家介绍的js 创建对象的几种方法详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对本站网站的支持!