JavaScript原型,原型链

本文深入讲解了JavaScript中对象的原型链概念,解释了如何通过原型链实现属性查找机制,并通过实例展示了如何为对象添加属性和方法。
每个对象都会在其内部初始化一个属性,就是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 中的原型原型链是理解其面向对象特性的关键部分。 ### 什么是原型 (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 那里找到了对应的实现. ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值