考虑到后续的应用需要,特将JS面向对象的东西再复习梳理重新认识一遍。
JS 创建对象的方式有不少,目前主要受推重的方式是组合模式(构造函数模式结合原型模式)。下面分别介绍、层层推进笔记。
1早期创建对象new模式
实例化一个对象,然后用点号.给实例赋予属性、方法。
|
|
2对象字面量创建对象模式(推荐)
对第1种进行改造,变成对象字面量,更简介方便:
|
|
3工厂模式
可以无数次调用这个函数,而每一次都会返回一个包含三个属性一个方法的对象;工厂模式解决了创建多个相似对象的问题;但没有解决对象识别问题。
|
|
4构造函数模式
先上代码:
|
|
构造函数模式与 3工厂模式的区别:
- 没有显式地创建对象;
- 直接将属性和方法赋给了this对象;
- 没有return语句。
构造函数的函数名的首字母一般是大写字母:Person;
要创建Person的新实例,得使用new操作符;此方式调用构造函数会经历一下4个步骤:
- 创建了一个新对象;
- 将构造函数的作用域赋给了新对象,于是this 就指向了这个新对象;
- 执行构造函数代码(添加属性);
- 返回新对象。
构造函数存在的问题:每一次生成一个新实例,三个属性一个方法全部都被重新创建一次;每个实例,三个属性不同、理应要重新创建;但是相同的一个方法 sayName
,被重复创建,占用了内存。
5原型模式
读取person1.name时,先在实例上搜索一个名为name的属性;存在就返回、不再搜索原型了。对象实例添加属性会屏蔽原型对象相同的属性,但不会修改原型的属性。
|
|
6组合模式(构造模式和原型模式)
构造函数模式用于定义实例属性,原型模式用于定义方法和共享的属性;这样,每个实例都会有自己的一份实例属性的副本,同时又共享着对方法的引用,最大限度地节省了内存。组合模式还支持向构造函数传递参数。
|
|
原型模式的一些验证方法
isPrototypeOf():判断某个proptotype对象和某个实例之间的关系,如:
|
|
hasOwnProperty():每个实例对象都有一个hasOwnProperty()方法,用来判断某一个属性到底是本地属性,还是继承自prototype对象的属性。如:alert(person1.hasOwnProperty("name")); // true
。
in运算符:in运算符可以用来判断,某个实例是否含有某个属性,不管是不是本地属性。如:alert("name" in person1); // true
。
in运算符还可以遍历某个对象的所有属性:
|
|
除此之外,JS创建对象还有其它一些方式:动态原型模式、寄生构造函数模式、稳妥构造函数模式。这里就暂且不管了,组合模式是比较常用的嘛。
学习参考:
JavaScript高级程序设计(第3版)
Javascript 面向对象编程(一)