创建对象的方式:
1)字面量方式:
2)系统内置的构造函数:
-
自动创建对象
-
手动添加成员
-
自动返回对象
3) 工厂函数方式:
手动创建对象
手动添加成员
手动返回对象
系统内置的构造函数:Object,Array,Date,Function,RegExp,String,Number,Boolean
Object是系统的顶级构造函数
自定义构造函数:
1. 构造函数的名字首字母大写(建议大写)
2. 构造函数中的this指向实例化的实例对象(构造函数中添加的成员函数中的this指向,调用这个方法的对象)
3. 在构造函数中,不需写return
--如果写了return,而返回的是基本数据类型,则不影响构造函数实例化
--如果写了return,而返回的是复杂数据类型,则会影响构造函数实例化(这个构造函数白写了)
4. 实例化构造函数的时候,构造函数后的括号可以不写,但是如果要传递参数则一定要写(建议都写上)
自定义构造函数:
作用:就是用来创建对象,也叫做实例化对象的
在创建对象,new 构造函数的时候,做了哪些事情?
1. 在内存中开辟一个对象的空间地址
2. 将关键字this,指向创建的这个对象空间
3. 执行函数内的代码(给这个对象添加成员)
4. 将这个对象空间地址返回
访问对象中的成员:对象.属性 --js是动态语言,在访问某个成员的时候,先去该对象里面查找,如果找不到则,添加一个成员,但是没有赋值(属性值)
原型对象:(将方法写到原型对象中,可以解决构造函数中的写方法造成的内存浪费问题)
__proto__:
对象中都有一个属性 __proto__,这个属性指向的是一个对象空间
实例对象也是对象,实例中也有__proto__属性,指向的对象空间
__proto__属性是属于非标准属性,这个属性是给浏览器使用
prototype:
函数中都以一个属性 prototype,这个属性指向的也是一个对象空间
构造函数也是函数,构造函数中也有prototype属性,指向一个对象空间
prototype属性是标准属性,这个属性是给程序员使用的
总结:
1)构造函数创建的实例对象中的__proto__属性指向的对象空间,和这个构造函数的属性prototype指向的对象空间是同一个,这个对象我们叫原型对象
2)原型对象中自带了一个属性constructor,这个属性指向的是构造函数
3)对象可以存储数据,原型对象也是对象,也可以存储数据
4)给原型对象添加成员,使用构造函数的prototype来添加
5)属性直接写在构造函数体内 ,方法写在原型上
(将方法写到原型对象中,可以解决构造函数中的写方法造成的内存浪费问题)
-
p1
自己没有sayHi
方法,就会去自己的__proto__
中查找 -
p1.__proto__
就是Person.prototype
-
我们又向
Person.prototype
中添加了sayHi
方法 -
所以
p1.sayHi
就可以执行了
判断对象的类型:
instanceof 检测对象是否是某个类的实例 -
对象 instanceof 内置构造函数, --(返回值为布尔值)
-
“对象.constructor”常被用来严格区分“对象的类型”。
-
检测数据的类型: typeof(检测数据) --返回值为类型
万能数据类型检测: Object.prototype.toString.call(检测数据) --返回值为object 数据类型