JavaScript原型,原型链

本文介绍了JavaScript中对象的__proto__属性和原型链的工作原理。对象通过__proto__查找属性,且JavaScript对象没有原型副本。构造函数的prototype影响实例的原型。原型链机制使得属性查找沿着原型链递归进行。

总体的概述

每个对象都会在其内部初始化一个属性,也就是__proto__,当我们访问一个对象的属性时,如果这个对象内部不存在这个属性,那么他就会去__proto__里找这个属性,这个__proto__有会有自己的__proto__,于是就这也一直找下去,也就是我们平时所说的原型链的概念。
按照标准,__proto__是不对外公开的,也就是说是个私有属性
关系:instance.constructor.prototype == instance. __proto __

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

  • 当我们需要一个属性的时,Javascript引擎会先看当前对象中是否有这个属性, 如果没有的
  • 就会查找他的Prototype对象是否有这个属性,如此递推下去,一直检索到 Object 内建对象
原型 
  • JavaScript的所有对象中都包含了一个 [__proto__] 内部属性,这个属性所对应的就是该对象的原型
  • ·JavaScript的函数对象,除了原型 [__proto__] 之外,还预置了 prototype 属性
  • 当函数对象作为构造函数创建实例时,该 prototype 属性值将被作为实例对象的原型 [__proto__]
原型链 
  • 当一个对象调用的属性/方法自身不存在时,就会去自己 [__proto__] 关联的前辈 prototype 对象上去找
  • 如果没找到,就会去该 prototype 原型 [__proto__] 关联的前辈 prototype 去找。依次类推,直到找到属性/方法或 undefined 为止。从而形成了所谓的“原型链”
JavaScript 中的原型原型链是理解其面向对象特性的关键部分。 ### 什么是原型 (Prototype)? 每个函数在创建时都会自动获得一个名为 `prototype` 的属性,这个属性指向一个对象(称为原型对象)。当通过构造函数 (`new`) 创建实例时,该实例内部会有一个指针(通常表示为 `__proto__`),它指向构造函数的 `prototype` 属性所引用的对象。因此,所有从同一个构造函数创建出来的对象都共享相同的原型对象。 例如: ```javascript function Person(name) { this.name = name; } Person.prototype.sayHello = function() { console.log('Hello, I am ' + this.name); }; let person1 = new Person('Alice'); ``` 在这个例子中: - `person1.__proto__ === Person.prototype // true` - 当访问 `person1` 上不存在的方法如 `sayHello()` 时,JS 引擎会在它的原型上查找并找到该方法,然后执行之 ### 什么是原型链(Prototype Chain)? 原型链是指由一系列相互关联的原型组成的链条结构。当我们尝试读取某个对象的一个属性或调用其方法时,并不一定能在当前对象自身直接找得到;如果找不到,则继续沿著这条“线”向上级寻找直到根部(null),这就是所谓的**委托机制**。 每当你创建一个新的普通对象 `{}` 或者使用 `Object.create(null)` 来建立自定义原型的对象外的所有对象,默认都有一个内置 Object 原型作为它们最终极祖先(`null`)之前的部分。 简单来说就是: 1. 对象本身 -> 如果没找到就去检查下一个层级... 2. 它们的直接原型对象(`__proto__`) 3. 再到更高级别的原型... 举个例子说明一下: ```js const animal = { breath: () => {console.log("Breathing");} }; function Dog(){ } Dog.prototype=animal; var doggy=new Dog(); doggy.breath(); // 输出 "Breathing" // 因为我们无法在 doggy 自身找到 .breath(), 所以沿着 __proto__ 寻找,在 Animal 那里找到了对应的实现. ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值