js高级:原型与原型链

目录

一.原型对象

什么是原型对象?

二.原型链

什么是原型链?

原型的作用是什么?

三.构造函数 

 实例化对象

四.三者之间的关系

 注意

 proto_的指向

对象访问成员的过程 

hasOwnPropety方法 

In操作符 

prop

objectName

小结


一.原型对象

什么是原型对象?

在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总是指向对应的原型对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值