5分钟内理解 .prototype 链

更新日期: 2024-09-20阅读: 401标签: 原型

在JavaScript的世界里,原型(prototype)系统是一个常被讨论但不易掌握的概念。作为JavaScript继承模型的基石,理解原型对于构建大型应用或进行对象操作至关重要。让我们一起探索这个迷人的话题,揭开原型系统的神秘面纱。


什么是原型?

在JavaScript中,每个对象都有一个内部属性[[Prototype]]。这个属性指向另一个对象,我们称之为原型。原型就像一个模板,对象从中继承属性和方法。

当我们尝试访问一个对象的属性或方法时,JavaScript首先在对象本身查找。如果没有找到,它会沿着原型链向上查找,直到找到该属性或达到原型链的顶端(null)。

我们通过一个简单的例子来理解这个过程:

const animal = {
  makeSound: function() {
    console.log("Some generic animal sound");
  }
};

const dog = Object.create(animal);
dog.bark = function() {
  console.log("Woof!");
};

dog.makeSound(); // 输出: "Some generic animal sound"
dog.bark();      // 输出: "Woof!"

在这个例子中,dog对象继承了animal的makeSound方法,同时拥有自己的bark方法。


创建对象与原型

我们深入了解对象创建时原型是如何链接的:

function Person(name) {
  this.name = name;
}

Person.prototype.greet = function() {
  console.log(`Hello, I'm ${this.name}`);
};

const alice = new Person("Alice");
alice.greet(); // 输出: "Hello, I'm Alice"

这里发生了什么?

  1. Person是一个构造函数
  2. 当我们使用new关键字创建Person的实例时,JavaScript创建了一个新对象(alice),并将其[[Prototype]]链接到Person.prototype。
  3. 当调用alice.greet()时,JavaScript首先在alice对象上查找greet方法。没有找到,所以它沿着原型链查找,在Person.prototype上找到并执行了这个方法。


原型链与继承

JavaScript通过原型实现继承。与传统的类继承不同,JavaScript对象直接从其他对象继承。这被称为"原型继承"。让我们扩展前面的例子来演示继承:

function Developer(name, language) {
  Person.call(this, name);
  this.language = language;
}

Developer.prototype = Object.create(Person.prototype);
Developer.prototype.constructor = Developer;

Developer.prototype.code = function() {
  console.log(`${this.name} is coding in ${this.language}`);
};

const bob = new Developer("Bob", "JavaScript");
bob.greet(); // 输出: "Hello, I'm Bob"
bob.code();  // 输出: "Bob is coding in JavaScript"

在这个例子中:

  1. 我们使用Object.create(Person.prototype)创建了Developer.prototype,确保Developer实例继承自Person.prototype。
  2. 我们重置了Developer.prototype.constructor,使其指向Developer函数。
  3. bob现在可以访问从Person.prototype继承的greet方法和定义在Developer.prototype上的code方法。


原型方法与属性遮蔽

当直接在对象上添加一个属性或方法时,它会遮蔽原型链中同名的属性或方法:

bob.greet = function() {
  console.log("Hi, I'm a developer!");
};

bob.greet(); // 输出: "Hi, I'm a developer!"

在这个例子中,直接定义在bob上的greet方法覆盖了从Person.prototype继承的方法。


修改原型的风险

虽然可以修改内置原型如Array.prototype或Object.prototype,但这通常是不推荐的做法。这可能导致不可预知的行为和与其他代码的冲突。


结语

JavaScript的原型系统虽然初看复杂,但掌握它能让我们更深入地理解JavaScript的工作原理。尽管在使用现代JavaScript和TypeScript的项目中,我们很少直接操作原型,但理解原型对于调试和优化应用程序仍然至关重要。

通过深入理解原型,我们能够编写更高效、更灵活的JavaScript代码,为构建强大的前端应用奠定坚实基础。

作者:dev 大迁世界
原文:https://mp.weixin.qq.com/s/cQaMVVcWGr30PafMorXuIw


链接: https://www.fly63.com/article/detial/12713

JS的原型链的理解。

JS是一个非常有魅力的语言也是一个比较烦人的语言,主要就是因为他的特殊性灵活性。JS的原型链,需要深刻的研究才能搞懂。不要纠结细节吧。实在不行就按这个死背住,慢慢就理解了。总之吧就是一句话万物皆对象。

JavaScript 原型的深入指南

不学会怎么处理对象,你在 JavaScript 道路就就走不了多远。它们几乎是 JavaScript 编程语言每个方面的基础。事实上,学习如何创建对象可能是你刚开始学习的第一件事。

JavaScript原型深入浅出

不学会怎么处理对象,你在 JavaScript 道路就就走不了多远。它们几乎是 JavaScript 编程语言每个方面的基础。事实上,学习如何创建对象可能是你刚开始学习的第一件事。

javascript中的prototype和__proto__的理解

在工作中有时候会看到prototype和__proto__这两个属性,对这两个属性我一直比较蒙圈,但是我通过查阅相关资料,决定做一下总结加深自己的理解

理解Js原型和原型链

在JS中,函数的本质就是对象,它与其他对象不同的是,创建它的构造函数与创建其他对象的构造函数不一样。那产生函数对象的构造函数是什么呢?是一个叫做Function的特殊函数,通过new Function 产生的对象就是一个函数。

JS原型解析

JS中原型是为了实现代码重用的一种仿类机制,不过它跟类又完全不同。它通过给对象添加原型关系(即给某个对象添加__proto__属性)实现一个关联。把共有的方法和属性放到这个关联上即实现了JS的继承。简单来说就是一种委托机制

js中__proto__与prototype的关系

了解JavaScript中原型以及原型链只需要记住以下2点即可:对象都有__proto__属性,指向构造函数的prototype;构造函数\\函数都有prototype属性,指向构造函数的原型

js原型链的看法

对象:1,函数对象:有function创造出来的函数2,普通对象:除开函数对象之外的对象,都是普通对象**即普通对象obj是构造函数Object的一个实例,因此:

Js原型到原型链

每个函数都有一个 prototype 属性,函数的 prototype 属性指向了一个对象,这个对象正是调用该构造函数而创建的实例的原型,也就是这个例子中的 cat 和dog 的原型。

Js原型对象

这里不介绍原型链。javascript 中有若干长得跟prototype,proto很想的属性/函数,这里简单总结一下他们都是啥,哪个是原型对象,哪个不是。[[Prototype]]这个对象的一个内置槽,对程序员是不可见

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!