js中怎么创建对象?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
<强>创建对象强>
通过对象构造函数或对象字面量创建单个对象
这些方式有明显的缺点:使用同一个接口创建很多对象,会产生大量的重复代码。为了解决这个问题,出现了工厂模式。
<强>工厂模式强>
考虑在ES中无法创建类(ES6前),开发人员发明了一种函数,用函数来封装以特定接口创建对象的细节。(实现起来是在一个函数内创建好对象,然后把对象返回)。
function createPerson(姓名、年龄、工作){ var 才能,o=new 对象(); o.name才能=名称; o.age才能=年龄; o.job才能=工作; o.sayName才能=function () { ,,,警报(this.name); ,,}; return 才能;0; } var person1=createPerson(29岁的“Nicholas"“Software Engineer"); var person2=createPerson(27岁的“Greg"“Doctor");
<强>构造函数模式强>
像对象和数组这样的原生构造函数,在运行时会自动出现在执行环境。此外,也可以创建自定义的构造函数,从而定义自定义对象类型的属性和方法。
function 人(姓名、年龄、工作){ this.name才能=名称; this.age才能=年龄; this.job才能=工作; this.sayName才能=function () { ,,,警报(this.name); ,,}; } var person1=new 人(…); var person2=new 人(…);
<强>与工厂模式相比,具有以下特点:强>
- <李>
没有显式创建对象,
李> <李>直接将属性和方法赋给了这对象,
李> <李>没有返回语句;
李> <李>要创建新实例,必须使用新操作符;(否则属性和方法将会被添加到窗口对象)
李> <李>可以使用instanceof操作符检测对象类型
李><强>构造函数的问题:强>
构造函数内部的方法会被重复创建,不同实例内的同名函数是不相等的。可通过将方法移到构造函数外部解决这一问题,但面临新问题:封装性不好。
<强>原型模式强>
我们创建的每个函数都有一个原型属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。(原型就是通过调用构造函数而创建的那个对象实例的原型对象)。
使用原型对象的好处是可以让所有对象实例共享它所包含的属性和方法。换句话说,不必在构造函数中定义对象实例的信息,而是可以将这些信息直接添加到原型对象中。
function 人(){ } Person.prototype.name=癗icholas"; Person.prototype.age=29; Person.prototype.job=啊? Person.prototype.sayName=function () { ,,… }; var person1=new 人(); person1.sayName ();//癗icholas"
更常见的做法是用一个包含所有属性和方法的对象字面量来重写整个原型对象,并重设构造函数属性。
function 人(){ } Person.prototype={ 名称:才能“…“, 年龄:29岁才能 工作才能:“…“, sayName才能:函数(){ ,,,… ,,} }; Object.defineProperty (Person.prototype“constructor", { 可列举的才能:假的, 值:人,才能 });
<强>原型对象的问题:强>
他省略了为构造函数传递初始化参数这一环节,结果所有实例在默认情况下都将取得相同的属性值,虽然这会在一定程度带来一定的不便,但不是最大的问题,最大的问题是由其共享的本性所决定的。
对于包含基本值的属性可以通过在实例上添加一个同名属性隐藏原型中的属性。然后,对于包含引用数据类型的值来说,会导致问题。
<强>组合使用构造函数模式和原型模式强>
这是创建自定义类型的最常见的方式。
构造函数模式用于定义实例属性,而原型模式用于定义方法和共享的属性,所以每个实例都会有自己的一份实例属性的副本,但同时共享着对方法的引用,最大限度的节省了内存。同时支持向构造函数传递参数。
function 人(姓名、年龄、工作){ this.name才能=名称; this.age才能=年龄; this.job才能=工作; this.friends才能=[“S",“C"); } Person.prototype={ 构造函数:人,才能 sayName才能:函数(){ ,,,警报(this.name); ,,} }; var person1=new 人(…);js中怎么创建对象