本文介绍了js创建对象的几种方法,并分享给大家参考。具体内容如下。
1.工厂模式。
缺点:没有解决物体识别的问题,即如何知道物体的类型。
2.构造器模式。
与工厂模式相比:1。没有显式的对象创建;2.属性和方法直接分配给该对象;3.没有退货单。要创建person的实例,必须使用新的运算符。以这种方式调用构造函数实际上要经历四个步骤:1。创建新对象;2.将构造函数的范围分配给新对象;3.执行构造函数中的代码;4.返回新对象并创建一个自定义构造函数,以将其实例标识为特定实例。构造函数的缺点:每个方法都在每个实例上重新创建。Person1和person2都有一个sayName()方法,但这两个方法不是同一个Function实例。不同实例上同名的函数不相等。不需要创建完成相同任务的两个Function实例,而且这个对象是存在的,所以在执行代码之前不需要将函数绑定到特定的对象,可以如下。
将sayName属性设置为全局sayName函数,这样因为sayName包含指向该函数的指针,所以person1和person2对象共享同一个函数。但是,如果对象需要定义许多方法,那么必须定义许多全局函数,并且自定义引用类型不会被封装。为了解决上述问题,引入了原型模式。
3.原型模式。
理解原型对象我们创建的每个函数都有一个原型属性,它是一个指向对象的指针,这个对象的目的是包含特定类型的所有实例都可以共享的属性和方法。Prototype是通过调用构造函数创建的对象实例的对象原型。使用原型对象的优点是所有对象实例可以共享它包含的属性和方法。
首先,解析器将询问实例person1是否有name属性,如果有,它将返回。如果没有,继续在person1的原型中搜索name属性,如果有则返回。如果没有,继续搜索person1原型的原型。
IsPrototypeOf()确定实例和原型对象console . log(person . prototypeof . is prototypeof(person 1))之间的关联;//true Object.getPrototypeOf()返回[[prototype]]的值console . log(object . getprototypeof(person 1));//Person {name: "yvette ",age: 26,job3360 "engineer"}返回Person的原型对象。console . log(object . getprototypeof(person 1)==person . prototype)//true console . log(object . getprototypeof(person 1)。姓名);//yvette " hasown property()方法可以检测属性是存在于实例中还是原型中,并且只有当给定的属性存在于实例中时才会返回true。console . log(person 1 . hasown property(" name "));//false prototype和in运算符以两种方式在运算符中使用:单独使用和在for-in循环中使用。单独使用时,当可以通过对象访问给定属性时,in运算符返回true,而不管该属性是存在于实例中还是原型中。使用for in循环,返回所有可通过对象访问的可枚举属性,包括实例中的属性和原型中存在的属性。如果实例中的属性屏蔽了原型中的不可枚举属性,它也将被返回。IE9之前版本的实现中有一个Bug,它屏蔽了不可枚举属性的实例属性,使其不能在for-in中返回。
IE9之前的记者书里没有日志信息。虽然person实例中的toString()方法屏蔽了原型中的可枚举toString();原型缩写
因此,Person1.constructor不再指向Person,而是指向Object。如果构造函数很重要,则需要将其设置为适当的值,例如:
但是,这种方法会导致构造函数属性变得可枚举。如果要将其设置为不可枚举(默认为不可枚举),可以使用对象。定义性质(人。原型,“构造函数”,{enumerable: false,value : person });因为在原型中查找值的过程是一个搜索,所以我们对原型对象所做的任何修改都可以立即从实例中反映出来。如果重写整个原型对象,情况就不一样了。当构造函数被调用时,它会向原始原型添加一个[[prototype]]指针,将原型修改为另一个对象会切断构造函数和原始原型之间的连接。实例中的指针只指向原型,而不指向构造函数。
Person.prototype指向原始原型对象,但不指向新的原型对象。原型问题原型模式最大的问题是由它的共享性造成的。对于具有引用类型值的属性,问题更加突出。
我只是想修改person1的好友,但是导致person2的好友属性值发生了变化。因此,我们很少单独使用原型模式。
4.建筑模式与原型模式的结合。
创建自定义类型最常见的方法是将构造函数模式与原型模式相结合。构造器模式用于定义实例属性,原型模式用于定义方法和共享属性,这样每个实例都有自己的实例属性副本,同时共享对方法的引用,从而最大限度地节省内存。
除上述方法外,还有动态原型模式、寄生施工模式和安全施工模式,但由于使用频率较低,不再赘述。