全面解析js中的原型,原型对象,原型链

yizhihongxing

全面解析JS中的原型、原型对象、原型链

1. 原型

在Javascript中,每个函数都有一个内部属性 prototype,可以被称为原型。我们可以通过构造函数的 prototype 属性来为所有实例共享方法和属性。

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

Person.prototype.sayHello = function() {
  console.log(`Hello, my name is ${this.name} and I'm ${this.age} years old.`);
}

const person1 = new Person('Tom', 18);
const person2 = new Person('Jerry', 20);

person1.sayHello(); // 输出:Hello, my name is Tom and I'm 18 years old.
person2.sayHello(); // 输出:Hello, my name is Jerry and I'm 20 years old.

2. 原型对象

在JavaScript中,所有的对象都有一个特殊的属性 __proto__,它指向了对象的原型。我们可以通过对象的 __proto__ 属性来访问原型对象。每个构造函数的 prototype 都是一个对象,它作为 Constructor 构造函数的原型对象。

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

const person1 = new Person('Tom', 18);

// 访问原型对象
console.log(Person.prototype); // 输出:{sayHello: ƒ, constructor: ƒ}
console.log(person1.__proto__); // 输出:{sayHello: ƒ, constructor: ƒ}

// 验证原型对象
console.log(Person.prototype === person1.__proto__); // 输出:true

3. 原型链

当我们访问一个对象的属性时,如果对象本身没有该属性,javascript会沿着对象的 __proto__ 属性向上查找,一直到 __proto__ 为 null,该属性不存在。这个查找的过程就是原型链。

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

Person.prototype.sayHello = function() {
  console.log(`Hello, my name is ${this.name} and I'm ${this.age} years old.`);
}

const person1 = new Person('Tom', 18);

person1.sayHello(); // 输出:Hello, my name is Tom and I'm 18 years old.
console.log(person1.toString()); // 输出:[object Object]

在上面的代码中,当我们调用 person1.sayHello() 的时候,由于 person1 没有 sayHello 方法,javascript会在 person1.__proto__ 中查找,找到了 Person.prototype 中的 sayHello 方法并执行了;而当我们调用 person1.toString() 方法的时候,javascript会一直往上查找,最后找到了 Object.prototype 中的 toString 方法并执行了。

示例1

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

Animal.prototype.hello = function() {
  console.log(`I'm ${this.name}.`);
}

function Dog(name, color) {
  this.color = color;
  Animal.call(this, name); // 调用父类构造函数,通过call或apply方法改变this的指向
}

Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;

Dog.prototype.bark = function() {
  console.log(`I'm a ${this.color} dog.`);
}

const dog1 = new Dog('Toby', 'brown');
dog1.hello(); // 输出:I'm Toby.
dog1.bark(); // 输出:I'm a brown dog.

在上面的代码中,我们定义了一个 Animal 构造函数用于创建动物,并给所有动物都添加了一个 hello 方法。接着我们定义了一个 Dog 构造函数用于创建狗,继承了 Animal 构造函数,并给狗添加了一个 bark 方法。最后我们创建了一个 dog1 对象,并调用了 hellobark 方法,通过原型链的查找,我们成功访问到了继承的方法。

示例2

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

const person1 = new Person('Tom');

console.log(person1.constructor); // 输出:[Function: Person]
console.log(person1.__proto__.constructor); // 输出:[Function: Person]
console.log(Person.prototype.constructor); // 输出:[Function: Person]

在上面的代码中,我们定义了一个 Person 构造函数用于创建人,并创建了一个 person1 对象。接着我们访问了三个 constructor 属性,并打印了它们的值。由于 constructor 属性会随着 prototype 属性共享,在原型链的查找中被访问到,因此它们三个的值是相等的。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:全面解析js中的原型,原型对象,原型链 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • AngularJS使用ngMessages进行表单验证

    好的!那么在这里我将详细为您讲解如何使用AngularJS中的ngMessages模块进行表单验证。 什么是ngMessages? ngMessages是AngularJS模块中的一种指令,用于在UI层面进行表单验证。ngMessages会根据验证不通过时的条件,自动输出相应的错误消息。这样可以极大地方便用户填写表单,并且提示信息是根据具体情况显示的,让用户…

    JavaScript 2023年6月10日
    00
  • JavaScript实现网页带动画返回顶部的方法详解

    JavaScript实现网页带动画返回顶部的方法详解 当我们浏览很长的网页时,我们会发现有时候需要快速回到页面的顶部。通常,我们可以直接点击页面的滚动条或者键盘的 Home 键,但这种方式比较突兀。另外,很多时候我们需要一个能够流畅返回顶部的效果。在这里,我们将详细讲解使用JavaScript实现网页带动画返回顶部的方法。 实现步骤 实现网页带动画返回顶部的…

    JavaScript 2023年6月11日
    00
  • 对js eval()函数的一些见解

    下面就是“对js eval()函数的一些见解”的完整攻略。 1. eval()函数的介绍 eval() 函数是 JavaScript 中的一个内置函数,它接收一个字符串作为参数,然后将这个字符串解析为 JavaScript 代码并执行。eval() 函数可以用来动态地生成代码、动态地加载脚本以及实现其他一些动态脚本的功能。 2. eval()函数的使用 2.…

    JavaScript 2023年5月28日
    00
  • 用JS写了一个30分钟倒计时器的实现示例

    以下是用JS写一个30分钟倒计时器的实现示例的完整攻略: 步骤1:HTML结构 首先,在HTML文件中添加以下结构: <div id="timer">30:00</div> 这是倒计时器的外框,其中数字部分即为倒计时器的显示区域。 步骤2:CSS样式 接着,为倒计时器添加样式: #timer { font-size…

    JavaScript 2023年6月11日
    00
  • Angular实现的table表格排序功能完整示例

    让我为你详细讲解“Angular实现的table表格排序功能完整示例”的完整攻略。 什么是Angular实现的table表格排序功能 在Angular中,我们可以通过使用ngFor指令循环渲染table表格中的数据,并在表格头部添加按钮进行排序,达到对表格数据排序的目的。这种方法可以在应用中节省代码量,并提高数据可读性。 如何实现Angular实现的tabl…

    JavaScript 2023年6月10日
    00
  • JavaScript分秒倒计时器实现方法

    请看下面的详细讲解。 JavaScript分秒倒计时器实现方法 在网站或页面中经常需要倒计时功能,这就需要实现一个倒计时器。本文将介绍如何使用 JavaScript 实现一个分秒倒计时器。 实现方法 1. HTML 部分 首先我们来创建一个倒计时器标签。在 HTML 部分,我们使用 <div> 标签来放置倒计时器的数字。同时在 <head&…

    JavaScript 2023年6月11日
    00
  • 为JS扩展Array.prototype.indexOf引发的问题及解决办法

    如果扩展 Array.prototype.indexOf 方法,可能会在不经意间影响到其他代码或第三方库的运行,导致一些难以发现或修复的奇怪问题。在扩展 Array.prototype.indexOf 方法时,应该考虑仔细分析其潜在影响,并采取一些防范措施以避免可能出现的冲突和问题。 为JS扩展Array.prototype.indexOf引发的问题 当我们…

    JavaScript 2023年6月11日
    00
  • Bootstrap轮播加上css3动画,炫酷到底!

    下面是关于“Bootstrap轮播加上css3动画,炫酷到底!”的完整攻略。 1. 准备工作 首先,在使用Bootstrap轮播加上css3动画之前,你需要先做好一些准备工作,包括: 在你的HTML文件中引入Bootstrap的CSS和JavaScript文件。 创建轮播的HTML结构。 为轮播添加必要的样式。 如果你对以上准备工作有疑问,可以参考Boots…

    JavaScript 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部