目录
一.原型对象
什么是原型对象?
在js中,每一个函数类型的数据,都有一个叫做prototype的属性,这个属性指向的是一个对象,就是所谓的原型对象
对于原型对象来说,它有一个construtor属性,指向它的构造函数
二.原型链
什么是原型链?
1.对象的创建
2.对象的组织结构
3.对象访问成员的规定
在js中万物都是对象,对象和对象之间并不是独立存在的,对象和对象之间有一定关系
通过对象_proto_属性指向函数原型的对象(函数.prototype)一层一层往上找,直到找到原型对象Object.protype为止,层层继承的连接结构叫做原型链(通过proto属性形成原型的链式结构)
原型的作用是什么?
1.所有对象实例共享原型对象所包含的实力和方法,节约内存空间
2.实现继承
注:函数也是一个对象,对象不一定是函数(对象有_proto_属性,函数有prototype属性)
三.构造函数
实例化对象
在js中,用new关键字来调用的函数,称为构造函数,构造函数的首字母要大写,使用new关键字创建出来的对象,称为该构造函数的实例化对象
其中new关键字主要做了
1.实例化了一个对象
eg:let fn=new Fn();变量fn表示实例化对象
2.将构造函数内的this指向实例化对象 eg:this->fn;
3.将实例化对象的_proto_指向构造函数的原型对象上
4.将属性和方法添加到实例化对象上
四.三者之间的关系
注意
1.源头:Function函数对象自动产生第一个对象
2.除Function函数对象之外,所有的函数对象都是由Function函数对象创建的
3.Function函数会自动创建出很多函数出来(内置函数),其中自动创建的第一个函数是Object对象函数
4.所有的函数对象都一定有一个对应的原型对象,所有的原型对象都是由Object函数对象创建的
5.所有原型对象都有一个名为constructor引用类型变量,该引用变量的值是对应函数对象的引用值,即constructor指向函数对象
6.所有对象都有一个_proto_引用类型变量,指向创建该对象的函数的原型对象(function.prototype)
proto_的指向
(1)Function函数对象中的__proto__指向Function原型对象(2)Object原型对象中__proto__的值为null
(3)除Function函数对象和Object原型对象之外,对象中的__proto__指向--谁创建了__proto__所属的对象,就指向谁的原型对象
对象访问成员的过程
1)当前对象中如果有该成员就该到该成员,访问结束;
2)当前对象中如果没有该成员,则到__proto__指向的对象中找到成员,找到就结束,如果没有找到,就继续通过__proto__指向的对象中去找。
hasOwnPropety方法
作用:
判断访问的对象属性是否来源于对象本身
当返回值为fasle时,该属性不存在或存在于原型对象中
用法:
object.hasOwnProperty(propertyName)
hasOwnProperty() 只会检查对象的自有属性,对象原形上的属性其不会检测;但是对于原型对象本身来说,这些原型上的属性又是原型对象的自有属性,所以原形对象也可以使用hasOwnProperty()检测自己的自有属性;
let obj = {
name:'张睿',
age:18,
eat:{
eatname:'面条',
water:{
watername:'农夫山泉'
}
}
}
console.log(obj.hasOwnProperty('name')) //true
console.log(obj.hasOwnProperty('age')) //true
console.log(obj.hasOwnProperty('eat')) //true
console.log(obj.hasOwnProperty('eatname')) //false
console.log(obj.hasOwnProperty('water')) //false
console.log(obj.hasOwnProperty('watername')) //false
console.log(obj.eat.hasOwnProperty('eatname')) //true
console.log(obj.eat.hasOwnProperty('water')) //true
console.log(obj.eat.hasOwnProperty('watername')) //false
console.log(obj.eat.water.hasOwnProperty('watername')) //true
In操作符
判断一个属性是否存在,在查找这个属性时候,先在对象本身中找,如果对象找不到再去原型中找。换句话说,只要对象和原型中有一个地方存在这个属性,就返回true
用法:
prop in object
参数:
prop
一个字符串类型或者 symbol
类型的属性名或者数组索引(非 symbol
类型将会强制转为字符串)。
objectName
检查它(或其原型链)是否包含具有指定名称的属性的对象。
// 数组
var trees = new Array("redwood", "bay", "cedar", "oak", "maple");
0 in trees // 返回true
3 in trees // 返回true
6 in trees // 返回false
"bay" in trees // 返回false (必须使用索引号,而不是数组元素的值)
"length" in trees // 返回true (length是一个数组属性)
Symbol.iterator in trees // 返回true (数组可迭代,只在ES2015+上有效)
// 内置对象
"PI" in Math // 返回true
// 自定义对象
var mycar = {make: "Honda", model: "Accord", year: 1998};
"make" in mycar // 返回true
"model" in mycar // 返回true
判断一个属性是否存在于原型中
如果一个属性存在,但是没有在对象本身中,则一定存在于原型中
小结
1、Object的原型对象中的成员,可以所有对象访问,Object是原型链的尽头,Object原型对象通过Object.prototype得到
2、所有的原型对象都是由Object函数对象创建的
3、new 出的对象是由函数对象创建的\
4、所有的对象中都自带属性__proto__,__proto__指向一个对象
5、Object原型对象中__proto__特殊,它的值为null
6、Function函数对象中__proto__特列,它指向Function原型对象
7、所有的函数对象中都有prototype属性,原型对象和new 出来的对象中没有
8、prototype总是指向对应的原型对象。