js原型链、作用域

 

// 原型链:当从一个对象那里调取属性或者方法的时候,如果该对象自身不存在这样的属性或者方法,
// 就会去关联的prototype那里寻找。如果prototype没有,就会去prototype关联的prototype那里寻找
// 知道prototype....prototype...为null的时候,从而形成了原型链(根本上来说就是继承的关系)
// a.isPrototypeOf(b)判断a是否存在b的原型链中 b在a下游,但自身不能说存在自身原型链中

function Product(title){
				this.title=title;
			}
			var p=new Product('口红');

			console.log(p.constructor==Product);//true
			console.log(p.__proto__==Product.prototype);//true
			console.log(Product.prototype.isPrototypeOf(p));//true
			console.log(Object.prototype.isPrototypeOf(p));//true
			console.log(Product.prototype.__proto__==Object.prototype);//true
			console.log(Object.prototype.__proto__);//null
			console.log(Object.prototype.isPrototypeOf(Product.prototype));//true

ele.innerHtml="<p>11</p>"和ele.innerHtml的底层原理

var circle={
     r:10,
     get arc(){
         return Math.PI*this.r*this.r
     },
     set arc(val){
         this.r=val;
     }
 }
circle.arc=100;
console.log(circle.r,circle.arc)

对象的属性值

// 定义属性特征,一般特殊情况才是用
			Object.defineProperty(stu,'password',{
				// 对应属性的值
				value:123,
				// 是否可以被修改
				writeable:false,
				// 是否可以被遍历
				enumerable:true,
				// 是否可以被重新配置
				configurable:false
			})
	// 修改不成功,因为writeable为false,但是不会报错
			stu.password=345;

变量的提升和变量的作用域

// 如果一个变量声明以后,会把变量的声明提升到整个作用域的最前面,但是赋值还是原来的位置
			// console.log(a)//undefined
			// var a=10;
			// 等价于
			// var a;
			// console.log(a);
			// a=10;


			// 如果一个变量没有声明直接赋值,作用域就是赋值以后的区域可以使用
			// console.log(a) //报错a没有被定义
			// a=10



			// 通过function 函数名(){}定义的函数,会把整个函数提升到作用域的最前面
			// add()//111
			// function add(){
			// 	console.log(111)
			// }

			
			// add()  // 报错 add不是一个函数
			// var add=function(){
			// 	console.log(111)
			// }
			// 等价于
			// var add;
			// add();
			// add=function(){

			// }


			// 全局变量和局部变量同时生效,优先局部变量
			// var a=10;
			// function add(){
			// 	console.log(a);
			// 	var a=100;
			// }
			// add()//undefined


			// function add(){
			// 	var a=100;
			// }
			// 考查的是变量作用域问题 a is not defined
			// console.log(a)


			// 如果一个变量没有声明直接赋值,作用域就是赋值以后的区域可以使用
			// function add(){
			// 	 a=100;
			// }
			// add()
			// console.log(a)//100

			// js中只有函数的作用域,声明变量的作用域,是向上寻找距离该变量最近的开始的函数的{变量的作用范围就是{}以内
			function add(){
				var a=100;
			}
			add();
			console.log(a);//a is not defined

  作用域:在js中只有函数的作用域,在函数内部声明的变量,才称为局部变量
            全局和局部变量只是相对来说的
   作用域链:在某个作用域内使用变量的时候,首先会在该作用域内寻找该变量,如果没有会一致向上寻找,这样的一种链式关系就是作用域链.其实指的就是变量的就近原则

function add(){
		 		// 对于add函数来说 a是局部变量。但是对于mul函数来说a可以是全局变量
			 	 var a=100;
			 	 function mul(){
			 	 	var a=10;
			 	 	console.log(a)
			 	}

			 	mul()//10 内部函数的内部有a所以就近取了a的值

			}

js有三部分组成 DOM(文档对象模型)+BOM(浏览器对象模型)+ECMAScript (基本语法)
es6就是对ECMAScript扩展

es6新增let和const,let用于声明变量,但和var不同的是不能用let在一个作用域内部重复声明一个变量

// var声明以后 let不能声明,声明也会存在重复声明报错的情况
			// let a=100;
			// {
			// 	// var声明的变量有变量提升的概念
			// 	var a=10; //Identifier 'a' has already been declared
			// }


// 不会报错 let块级作用域:{就是代码块}向上寻找距离该变量最近的开始的{ 作用范围就是该{}之内
			// var a=100;
			// {
			// 	let a=10;
			// } 

暂时性死区:在一个代码块内,如果有某个变量,会绑定该区域,不再受外界的影响,let没有变量提升的概念

const用于声明常量,其余规则和let一样

	const a=100;
			a=100;//Assignment to constant variable.

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
原型链JavaScript中实现继承的主要方式之一,它基于原型的概念来实现属性和方法的继承。在JavaScript中,每个对象都有一个指向其原型的链接,这个链接被称为[[Prototype]]属性。当访问一个对象的属性时,如果该对象自身没有这个属性,JavaScript会沿着原型链向上搜索,直到找到该属性或者到达原型链的末端。 原型链的底层原理可以简单描述为以下几个步骤: 1. 当创建一个函数时,JavaScript会自动创建一个原型对象,并将其关联到该函数的prototype属性上。 2. 当创建一个对象实例时,JavaScript会将该对象实例的[[Prototype]]属性指向其构造函数的原型对象(即prototype属性所指向的对象)。 3. 当访问对象的属性时,JavaScript首先会在对象自身中搜索该属性。如果找到了,就直接返回该属性的值。 4. 如果对象自身没有该属性,JavaScript会沿着对象的原型链向上搜索,即访问对象的[[Prototype]]指向的原型对象。 5. 如果在原型对象中找到了该属性,就返回该属性的值。如果还没有找到,则继续向上搜索原型对象的原型对象,直到找到属性或者到达原型链的末端。 这样,通过原型链的搜索机制,JavaScript实现了属性和方法的继承。当一个对象的属性或方法没有在自身中找到时,它会通过原型链向上搜索,直到找到该属性或方法为止。这使得我们可以在一个对象的原型对象上定义属性和方法,从而使得所有基于该对象创建的实例都可以共享这些属性和方法。 需要注意的是,原型链有一些问题。其中一个问题是原型对象上的引用类型值是所有实例共享的,这意味着不同实例的引用类型属性或方法都指向同一个堆内存。因此,在原型对象上修改引用值会同时影响到所有的实例。为了避免这个问题,通常会在构造函数中定义私有属性或方法,而不是在原型上定义。 另一个问题是,当将一个构造函数的原型对象设为另一个构造函数的实例时,如果在这时给另一个构造函数传递参数设置属性值,那么基于原来的构造函数所有实例的该属性都会因为原型链的关系共享相同的值。这可能不是我们想要的结果,因此在这种情况下需要小心使用原型链。 综上所述,原型链作用域链底层原理是通过对象的[[Prototype]]属性实现属性和方法的继承,通过沿着原型链向上搜索的方式进行属性查找。同时,原型链也存在一些问题,需要注意使用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [前端必经之路:JavaScript底层原理(深入理解JS数据类型、预编译、执行上下文、作用域、构造函数、原型链、...](https://blog.csdn.net/William_bb/article/details/101077313)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值