原型对象概念
在构造函数创建出来的时候,系统会默认帮构造函数创建并关联的一个新对象
自定义构造函数的原型对象默认是一个空对象。
原型对象的作用
构造函数中的原型对象中的属性和方法可以被使用该构造函数创建出来的对象使用。
即以自定义构造函数方式创建出来的所有对象,自动拥有和共享该构造函数的原型对象中的所有属性和方法。
如何访问构造函数的原型对象
① 构造函数.protoType
② 对象.__proto__(不推荐)
设置原型对象的属性和方法
① 利用对象的动态特性来为构造函数的原型对象添加属性和方法
② 替换原型对象
原型对象的使用注意
实例和实例化
实例化
:通过构造函数创建具体对象的过程。
实例
:通过构造函数实例化出来的对象,我们称之为该构造函数的一个实例。
注意:在说实例的时候,一定要指定是某个具体构造函数的实例
function Person() {
}
// 使用 new Person() 创建对象的过程称为实例化
// p1就是Person这个构造函数的实例
var p1 = new Person();
原型的使用方法
① 利用对象的动态特性给原型添加属性|方法
如果要添加的方法过多,则有大量重复代码
// 1.提供一个构造函数
function Person() {
// this = obj;
this.name = '默认';
}
// 2.设置原型对象的成员(属性+方法)
// 添加成员
Person.prototype.des = 'des';
Person.prototype.logDes = function () {
console.log(this.des);
}
// 修改成员
Person.prototype.des = 'log';
var p1 = new Person();
// 删除
delete p1.des;// 删除的是p1自己的des属性,无法删除原型对象的属性
delete Person.prototype.des;
② 直接替换原型对象
01 替换前后创建的对象所指向的原型对象不一致
02 替换原型对象会切断和之前的原型对象之间的关系
原型对象的使用注意
① 访问属性:构造函数创建出来的对象在访问属性的时候,会先在实例内查找,如果没有找到则进一步到对应的原型对象中查找
② 设置属性:
在使用点语法进行赋值的时候,无法操作到对应的原型对象
如果该属性在对象中已经存在,则修改该属性的值
如果该属性在对象中尚未存在,则新增该属性
③ 设置原型对象的属性:
[01] 设置原型对象的属性,只能通过构造函数.Prototype的方式|替换原型对象的方式设置
[02] 如果原型对象的属性是值类型,那么只能通过Person.prototype.属性的方式修改其值
如果原型对象的属性是引用类型,那么可以通过对象名.引用对象.属性名的方式设置|修改
(1) 使用构造函数创建出来的多个对象的原型对象中的该属性指向的是同一块数据
(2) 某个对象对该原型对象属性进行了修改会影响到其他的对象
.proto属性说明
__proto__是一个非标准属性
即ECMAScript中并不包含该属性,这只是某些浏览器为了方便开发人员开发和调试而提供的一个属性,不具备通用性
建议:在调试的时候可以使用该属性,但不能出现在正式的代码中
```
hasOwnProperty方法
- ①.in 判断对象中是否存在指定的属性(实例属性+原型属性)
属性名 in 对象 - ②.hasOwnProperty 判断对象中是否存在指定的实例属性
- ③.判断某个属性是否是原型属性,并且仅仅是原型属性
1.属性
2.不是实例属性
function isPrototypeProperty(obj,objName) {
return objName in obj && !obj.hasOwnProperty(objName);
}
console.log(isPrototypeProperty(p1, 'name')); // false
console.log(isPrototypeProperty(p1, 'des')); // true
console.log(isPrototypeProperty(p1, 'age')); // false
isPrototypeOf方法
isPrototypeOf: 判断一个对象是否是指定对象的原型对象
instanceof : 判断一个对象是否指定构造函数的实例对象