1.原型
- 什么是原型?
- js中每一个函数都自带的属性,它的值是一个对象,就好比(prototype:{……}),叫做原型对象
- 对于构造函数来讲,每通过构造函数实例化一个对象,都有一个隐藏的属性,指向该构造函数的原型对象。他们两个是全等的关系,实例化对象.__proto === 构造函数.prototype
- 原型对象就好像是一个公共区域,他可以被每一个实例化对象所访问(当然构造函数要相同,因为后面要往原型里添加方法,用别的构造函数 实例化的对象 的原型里是没有新增的方法的)
- 在创建函数的时候,我们如果将方法写在原型对象中,不但不会造成全局变量的污染,还可以被每一个用这个构造函数实例化的对象所共享
- 原型的作用:为实例化对象提供共享的属性和方法
- 怎么使用原型添加共享的属性和方法?
- 我们一般用构造函数.prototype.函数名 = 函数体,的方法为这个构造函数添加方法
例:
- 我们一般用构造函数.prototype.函数名 = 函数体,的方法为这个构造函数添加方法
function Person(name,age){
this.name = name;
this.age = age;
}
Person.prototype.sayHi = function(){
return '我是'+this.name+'今年'+this.age+'岁了'
}
var person01 = new Person('孙悟空',12)
// console.log(person01.constructor.prototype.__proto__.__proto__)
console.log(person01.sayHi())
2.原型里常用的几个属性
1.prototype属性
- js中的每个函数都默认有一个prototype属性,随着函数的声明自动生成
- 构造函数调用prototype可以得到构造函数的原型对象;
- 通过这个原型对象可以自定义共享属性供构造函数的实例化对象使用
2.constructor属性
- constructor属性的作用?
- constructor的作用是获取一个(实例化对象/构造函数)的构造函数
- 构造函数的最上级是Function,Function的构造函数依旧是它本身。
3.instanceof运算符
- 用于测试构造函数的prototype(原型对象)属性是否出现在原型链中的任何位置
- 这个方法可以用来判断一个数据是否是对象也可以判断一个数据是否是数组
- 语法: 实例化对象 instanceof Object/Array 返回布尔值
4.hasOwnProperty()方法
- 每一个实例化对象都有一个hasOwnProperty()方法,用来判断某个属性到底是本地属性还是来自原型的属性
- 通过构造函数添加的属性或方法叫做本地属性或方法
- 语法: 实例化对象.hasOwnProperty(),参数是字符串类型,返回布尔值
in运算符用来判断某个实例是否含有某个属性,不管是不是本地属性
语法: ‘属性’ in 实例化对象 返回布尔值
原型链
- 什么是原型链?
每一个对象都有原型对象。一个原型对象也是对象,所以它也有原型对象;
当一个对象去调用某个属性或者方法的时候,先从自身开始查找,如果有则使用;如果没有则到对象的原型中去查找。如果有则使用;如果原型中也没有,则会到原型的原型中去查找,这样就形成了一条链,叫做原型链。原型链的终点是Object的原型,如果该对象中依然没有找到,则返回undefined。 - 我们有时用的很多属性都是原型里的属性和方法不是直接就有的,我们一般都会省略
.__proto__
这个步骤,如图所示: