JavaScript原型,原型链, 内存图

JavaScript原型,原型链 ? 有什么特点?

每个对象都会在其内部初始化一个属性,就是prototype(原型),当我们访问一个对象的属性时,如果这个对象内部不存在这个属性,那么他就会去prototype里找这个属性,这个prototype又会有自己的prototype,于是就这样一直找下去,也就是我们平时所说的原型链的概念。

关系: instance.constructor.prototype = instance. _ proto _

特点: JavaScript对象是通过引用来传递的,我们创建的每个新对象实体中并没有一份属于自己的原型副本。当我们修改原型时,与之相关的对象也会继承这一改变。

当我们需要一个属性的时,Javascript引擎会先看当前对象中是否有这个属性, 如果没有的话,就会查找他的Prototype对象是否有这个属性,如此递推下去,一直检索到 Object 内建对象。

			function Func(){}
			Func.prototype.name = "Sean";
			Func.prototype.getInfo = function() {
			  return this.name;
			}
			var person = new Func();//现在可以参考var person = Object.create(oldObject);
			console.log(person.getInfo());//它拥有了Func的属性和方法
			//"Sean"
			console.log(Func.prototype);
			// Func { name="Sean", getInfo=function()}

Javascript作用链域?

全局函数无法查看局部函数的内部细节,但局部函数可以查看其上层的函数细节,直至全局细节。当需要从局部函数查找某一属性或方法时,如果当前作用域没有找到,就会上溯到上层作用域查找,直至全局函数,这种组织形式就是作用域链。

JavaScript有几种类型的值?,你能画一下他们的内存图吗?

栈: 原始数据类型(Undefined,Null,Boolean,Number、String)
堆: 引用数据类型(对象、数组和函数)

两种类型的区别是:存储位置不同;

  • 原始数据类型直接存储在栈(stack)中的简单数据段,占据空间小、大小固定,属于被频繁使用数据,所以放入栈中存储;
  • 引用数据类型存储在堆(heap)中的对象,占据空间大、大小不固定。如果存储在栈中,将会影响程序运行的性能;引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后从堆中获得实体


参考阅读:

  1. 作用域链
  2. 执行环境(EC)和作用域链
  3. 生成作用域链
  4. Object.prototype
  5. 构造函数Function
  6. JS 原型与原型链 (一)
  7. JS 原型与原型链 (二)
  8. JS 原型与原型链 (三)
  9. JS 原型与原型链 (四)
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: JavaScript原型链是一种继承机制,它使得每个对象都能从另一个对象继承属性。在 JavaScript 中,每个对象都有一个原型对象,并且可以从原型对象继承属性。 每个对象的原型对象都有一个自己的原型对象,以此类推。这就形成了一条原型链,从对象到原型对象再到其原型对象,直到最终到达 null。当你在对象上访问一个属性时,JavaScript 引擎会沿着原型链向上搜索,直到找到一个具有该属性的对象为止。 例如,假设我们有一个构造函数 `Person` 和一个实例 `person1`,它们看起来像这样: ``` function Person(name) { this.name = name; } Person.prototype.sayHi = function() { console.log(`Hi, my name is ${this.name}`); }; const person1 = new Person('Alice'); ``` 在这个例子中,`person1` 的原型对象是 `Person.prototype`,而 `Person.prototype` 的原型对象是 `Object.prototype`。所以,当我们在 `person1` 上调用 `sayHi` 方法时,JavaScript 引擎会在 `person1`、`Person.prototype` 和 `Object.prototype` 中依次搜索该方法,最终找到它并调用。 原型链使得我们能够实现继承,同时又不需要使用传统的继承语法 ### 回答2: JavaScript原型链是一种特殊的继承机制,它是基于对象的,与传统的基于类的继承不同。 在JavaScript中,每一个对象都有一个原型对象,而原型对象也是一个对象,并且它也有自己的原型对象,这样就形成了一条链式结构,被称为原型链。当我们访问一个对象的属性或方法时,如果对象本身没有这个属性或方法,它会沿着原型链向上查找,直到找到为止。 这个查找过程是通过对象的__proto__属性来实现的,__proto__属性指向该对象的原型对象。当我们访问对象的属性时,如果对象和它的原型对象中都没有这个属性,那么会继续查找原型对象的原型对象,直到找到属性或者到达原型链的顶端,即Object.prototype。如果还没有找到,那么返回undefined。 JavaScript原型链的实质是通过对象之间的关联关系来实现继承。当创建一个对象时,JavaScript引擎会自动为这个对象添加一个隐藏的属性__proto__,并将它指向该对象的构造函数的原型对象。这样,通过对象与原型对象之间的关系,实现了继承的特性。 原型链的应用主要体现在面向对象编程中的继承。通过定义构造函数和原型对象,我们可以实现对象的继承关系,并且可以方便地从原型对象中继承属性和方法,提高代码的复用性和可维护性。 总之,JavaScript原型链是一种通过对象关联来实现继承的机制,在面向对象编程中起到了重要的作用。它通过沿着原型链查找的方式,实现了属性和方法的继承,并提供了一种灵活、简洁的继承方式。 ### 回答3: JavaScript中的原型链是一种用于继承和属性查找的机制。每个JavaScript对象都有一个原型,它可以是另一个对象或null。 当我们访问一个对象的属性时,JavaScript引擎首先会在该对象自身查找该属性,如果找不到,它将继续在原型链上进行查找。原型链的顶层是Object.prototype,内置的JavaScript对象(如Array、String)都是它的子对象。 当我们创建一个对象时,JavaScript引擎会通过一个\_\_proto\_\_属性将该对象关联到它的构造函数的原型上。构造函数通过prototype属性来指定原型对象,在实例化对象时会自动创建一个存放共享方法和属性的原型对象。 通过原型链,对象可以继承自己的构造函数原型对象上的属性和方法。这意味着我们可以在原型对象上定义共享方法和属性,而不是每次创建新的对象时都重复定义这些方法和属性,从而节省内存空间。 当我们通过对象实例访问一个属性时,JavaScript引擎会首先在对象自身查找该属性,如果找不到,它会继续在原型链上查找,直到找到该属性或者到达原型链的顶层。如果该属性在原型链上的多个位置都有定义,那么只会取最先找到的属性值。 原型链是JavaScript中实现继承的基础。通过让一个对象的原型指向另一个对象的实例,我们可以实现原型继承。子对象可以继承父对象原型链上的属性和方法。 总结来说,JavaScript原型链是一种用于实现继承和属性查找的机制。它通过将对象的原型与其构造函数的原型对象关联起来,从而实现属性继承和共享方法的定义。原型链是JavaScript中面向对象编程的基础之一。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gxhlh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值