什么是对象?
javaScript对象类别概览对象(object)是数据的无序集合,其中数据包括基本类型、函数其他对象。对象的功能是它们将特定任务所需要的所有数据和行为收集到一个地方。例如,String对象存储文本数据并且还提供操作该数据所需要的许多函数。
所有的JavaScript数据类型都可以分为基本类型(Number、String、Boolean、null、undefined)和引用类型(对象、数组、函数)。对于引用类型,变量保存的是指向数据的引用,而不是数据本身。运算符“==”所执行的比较操作不检查两个变量引用的对象是否相等,而检查两个变量是否引用同一个对象。
1.工厂模式创建
缺点:无法判断对象的类型,比如 是一只猫 也可以写入这个里面
优点:可以一直调用这个函数,创建person对象,并且这个函数会一直返回三个固定的属性和一个sayName方法。
2.构造函数模式
优点:创建自定义的构造函数意味着可以归为一类来分别对象的类型。
缺点:每个方法都要在实例上重新的创建一次,person1和person2都有一个sayName的方法,解决这个问题就是可以将Person的sayName方法写在prototype属性(也可以参考上一篇文章,有利于理解继承)。
3.原型模式
理解原型对象
创建每个函数都有一个prototype属性,这个属性是一个指针,指向函数的原型对象。而在这个属性上的方法或者是其他属性都能够被实例所访问或者继承到(详情参考上一篇文章),所以第一个打印为true
实例都有一个constructor属性,指向实例的构造函数(也叫原型对象),所以第二个打印为true。
实例的内部将包含一个__proto__,指向构造函数的原型对象(prototype)。所以第三个打印为true
注意:
当代码读取某个对象的属性时,都会执行一次搜索(也称为解释器),目标是具有给定名字的属性。搜索首先从对象实例本身开始,如果在实例中找到了具有给定名字的属性,则返回该属性的值,如果没有找到,则继续搜索指针指向的原型对象,在原型对象中查找具有给定名字的属性。如果在原型对象中没有找到则会找到通用的Object。
优点:减少了代码的重复,也可标识用来创建对象。
缺点:
1.省略掉了为构造函数传递参数的这一步,在默认情况下所有的实例都会得到相同的值。
2.原型中的所有属性都是被很多实例共享的,但是对于引用类型的属性值,其中一个实例的改变都会影响到其他实例,甚至是原型对象(也可以参考上一篇文章的非构造函数继承)。
总结:
⑴每个构造函数都有一个原型对象
⑵每个原型对象都有一个指向构造函数的指针
⑶每个实例都有指向原型对象的内部指针
⑷每个原型对象上的属性和方法都能被实例所访问
4.组合使用构造函数模式和原型模式
构造函数模式用于定义实例属性,而原型模式用于定义方法和共享的属性。这样,每个实例都有自己的一份实力属性的副本,但同时又共享着对方法的引用,最大限度的节省了内存。而且还支持向构造函数传递参数。这种方式也是ECMAScript种使用最广泛,认同度最高的一种创建自定义类型的方法。
附:
所有对象都通用的属性和方法组合模式总结:
⑴ 构造函数内定义属性
⑵原型对象上定义方法
网友评论