JS8.9原型链,作用域(拓展)

本文深入探讨JavaScript中的原型链机制,解释了对象如何通过原型链查找属性和方法,以及原型链的继承过程。同时,文章还讲解了作用域的概念,包括函数内部对外部变量的访问规则和作用域链的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.原型链

在介绍原型链之前,先记住两个概念:①创建一个对象,这个对象一定会有一个_proto_属性,这个对象的__proto__属性指向构造该对象的构造函数的原型。②函数也是一种特殊的对象,所以函数也有__proto__属性,还有自己的原型属性prototype.函数的原型对象不断向上寻找的时候,也能读取到obj.prototype.

这里引用到了dovlie的一些图和例子

这里创建一个普通对象
var obj1{ x:1,y:2}


在这里插入图片描述

  • 原型链的继承

我们也用图例来演示

var y=function(){}

var x=new fn()

在这里插入图片描述

版权声明:本文为优快云博主「dovlie」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/dovlie/article/details/76228994

所以我理解的原型链的定义是这样的:

  1. 引用数据都有自己的原型对象,而原型对象也有原型对象,直到最顶层为null,是通过一层层指向最终找到null(也是一个对象类型),像链子一样把原型对象链起来所以叫原型链
  2. 一个对象访问数据时只能在自己的原型链上不断深入访问,不能跨链访问.
  3. 所有引用数据的祖先数据都是Object.prototype指向的对象
function fn () {
				this.name1="karen"
			
			}

fn.prototype=function() {
			        this.money=100
			}//当使用new调用fn这个函数时,创建的对象的原型对象就是等号后面的函数
			
			
			var f1=new fn()//这里相当于{name:"karen",__proto__:function(){this.money=100}}
			var f2=new fn()
			
			console.log(f1.__proto__.prototype)
			console.log(f2.__proto__)
			console.log(f2.__proto__===f1.__proto__)//true 所以f1,f2的原型对象是一个东西
			这里注意一个细节
			①f1.__proto__={color:white}
			②f1.__proto__.color="white";//这两行代码是有区别的,①的代码color:"white"这个属性只有f1.__proto__.color中能访问到,而②写法f2.__proto__.color也能访问到;
			我的理解是①在添加color这个属性时在f1的原型链指向,f2不能跨链访问,
			而②写法它先找到f1的__proto__属性,给这个对象里添加了一个属性,因为f1,f2的__proto__是同一个东西,所以f2也能访问的到

二.作用域(拓展)

  • 在这里记住三句话

    1:函数里面可以访问外面
    2:函数外面不能访问里面
    3:函数代码的执行,是在函数声明的作用域下执行,不是在调用的作用域下执行

var a=20
			function fn () {
				var a=30
				return function fm () {console.log(a)}
			}
			
			var re=fn()
			// console.log(re)
			re()//30
			console.log(a)//20
  • 这里还有一个知识点:
    同一个作用域内有相同的标识符:
    1.变量声明
    2.形参声明
    3.形参赋值(实参给形参上数据)
    4.函数声明
    (所以打印的时候函数的优先级>形参赋值优先级>形参声明优先级>变量声明优先级>)
function fn (a) {
		//先声明变量 var a
		//声明形参var a
		//给形参赋值a=1
		//声明函数:fun a
		console.log(a)//所以fun a覆盖了上面的值,所以这里打印fun a
		var a=2
		function a () {
			
		}
		console.log(a)//这里由于fun a被提前到了var a=2前面,所以var a=2相当于最后执行,所以这里打印2
	}
	fn(1)//结果为:function a () {
			
		}
		2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值