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

全面解析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日

相关文章

  • 前端设计模式——依赖注入模式

    依赖注入模式(Dependency Injection Pattern):允许我们通过将对象的依赖关系从代码中分离出来,从而使代码更加模块化和可重用。 在传统的编程模式中,一个对象可能会直接创建或者获取它需要的其他对象,这样会造成对象之间的紧耦合关系,难以维护和扩展。而使用依赖注入模式,则可以将对象的依赖关系从对象内部移到外部,从而实现松耦合的设计,便于维护…

    JavaScript 2023年4月18日
    00
  • jQuery学习笔记之Ajax用法实例详解

    当你需要从服务器异步获取数据、并且能够在不刷新页面的情况下动态更新网页内容时,Ajax是一种非常有用的技术。jQuery中的Ajax封装简单易用,本篇文章将详细讲解jQuery的Ajax用法。 Ajax简介 Ajax即”Asynchronous JavaScript and XML”(异步JavaScript和XML),是一种用于创建快速动态网页的技术。通过…

    JavaScript 2023年5月19日
    00
  • ScrollDown的基本操作示例

    关于”ScrollDown的基本操作示例”的完整攻略,可以按照以下步骤进行: 1. 打开ScrollDown 在浏览器中输入ScrollDown的地址,即可进入。 2. 查看菜单栏 在网页的菜单栏中,有多个选项,包括: Home Features Examples Documentation Support 3. 查看示例及其操作 在菜单栏中选择”Examp…

    JavaScript 2023年6月10日
    00
  • js常用方法、检查是否有特殊字符串、倒序截取字符串操作完整示例

    下面我就详细讲解一下这三个操作的完整攻略。 JS常用方法 JS中有许多常用方法,以下是一些常见的方法: querySelector:用于获取文档中匹配指定选择器的第一个元素。 getElementById:根据id获取文档中的元素。 addEventListener:用于向指定元素添加事件句柄。 setTimeout:用于在指定的时间之后执行一次函数。 se…

    JavaScript 2023年5月28日
    00
  • JavaScript 高级篇之闭包、模拟类,继承(五)

    JavaScript 高级篇之闭包、模拟类、继承是JavaScript语言学习中比较重要的一部分,本文将针对这三个概念进行详细的介绍和举例操作。 闭包 1.什么是闭包 闭包是指在一个函数内部定义的函数,并且这个函数可以访问到它外部函数作用域内的变量。闭包也可以定义在全局作用域内。JavaScript 中的所有函数都可以作为闭包来使用。 2.闭包的用途 实现数…

    JavaScript 2023年6月10日
    00
  • 详解JavaScript实现异步Ajax

    详解JavaScript实现异步Ajax Ajax(Asynchronous JavaScript and XML)即异步JavaScript和XML,是指页面无需刷新就能与服务器交换数据的技术。使用Ajax可以使网页更加高效,有良好的用户体验。在JavaScript中,可以使用XMLHttpRequest对象实现AJAX异步请求和响应。下面是如何实现Aja…

    JavaScript 2023年6月10日
    00
  • 利用jQuery.Validate异步验证用户名是否存在(推荐)

    这里是利用 jQuery.Validate 异步验证用户名是否存在的攻略。在这个攻略中,我们将会使用到 jQuery、jQuery.Validate 和 AJAX 技术。 简介 为了提高用户体验和安全性,我们需要在网站的注册和登录页面上添加对用户名的合法性验证,例如:长度、唯一性等。 在这个过程中,我们可以使用一些前端框架和插件来把这些验证工作变得更加简单。…

    JavaScript 2023年6月10日
    00
  • JavaScript的引用数据类型你了解多少

    引用数据类型是 JavaScript 中的一种数据类型,通常用于存储复杂的数据对象,比如数组、对象等。与之相对的是基本数据类型,如数字、字符串等。本篇攻略将详细讲解 JavaScript 的引用数据类型,包括什么是引用数据类型、与基本数据类型的区别、引用类型的常见用途。 什么是引用数据类型? 引用数据类型是一种数据类型,可以存储对象、数组和函数等复杂数据类型…

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