一文彻底理解js原生语法prototype,__proto__和constructor

yizhihongxing

一文彻底理解js原生语法prototype, __proto__ 和 constructor

什么是 prototype

在 JavaScript 中,每个函数都有一个 .prototype 属性。这个属性是一个指向对象的引用,它被称为原型对象(prototype object)。 如果在函数对象中定义了某个属性或方法,则该函数的所有实例都将继承该属性或方法。

下面是一个例子:

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

Person.prototype.sayHello = function() {
  console.log(`Hello, my name is ${this.name}`);
}

const person1 = new Person('小明', 18);
const person2 = new Person('小红', 20);

person1.sayHello(); // 输出 Hello, my name is 小明
person2.sayHello(); // 输出 Hello, my name is 小红

在上面的例子中,我们在 Person 函数的原型对象上定义了一个 sayHello 方法。然后通过使用 new 关键字创建了两个 Person 实例,它们都可以访问和使用 sayHello 方法。

什么是 __proto__

在 JavaScript 中,每个对象都有一个特殊的 __proto__ 属性,它指向该对象的原型对象。换句话说,当我们访问一个对象的某个属性时,如果该对象本身没有定义该属性,JavaScript 就会在该对象的 __proto__ 属性所指向的原型对象中寻找该属性。这就是原型继承的概念。

下面是一个例子:

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

Person.prototype.sayHello = function() {
  console.log(`Hello, my name is ${this.name}`);
}

const person = new Person('小明', 18);

console.log(person.__proto__ === Person.prototype); // 输出 true

在上面的例子中,我们在 Person 函数的原型对象上定义了一个 sayHello 方法。然后通过使用 new 关键字创建了一个 Person 实例。我们可以通过 person.__proto__ 访问该实例的原型对象,也可以通过 Person.prototype 访问 Person 函数的原型对象。在上面的例子中,这两个对象是相等的。

需要注意的是,在 ECMAScript 2015 (也就是 ES6)中,__proto__ 属性已经被标准化(它之前是一个非标准的属性)。并且我们也可以使用 Object.getPrototypeOf() 方法获取一个对象的原型对象。

什么是 constructor

在 JavaScript 中,每个函数都有一个 constructor 属性,它指向该函数本身。当我们通过使用 new 关键字创建一个对象时,JavaScript 会自动为该对象设置一个 constructor 属性,它的值为创建该对象的函数。这个 constructor 属性可以用来判断一个对象是由哪个函数创建的。

下面是一个例子:

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

const person = new Person('小明', 18);

console.log(person.constructor === Person); // 输出 true

在上面的例子中,我们通过使用 new 关键字创建了一个 Person 实例。我们可以通过 person.constructor 访问该实例的构造函数,也可以通过 Person 访问构造函数本身。在上面的例子中,这两个对象是相等的。

示例1:利用 prototype 和 constructor 实现继承

利用 JavaScript 中的原型继承,我们可以轻松实现对象之间的继承关系。下面是一个继承的示例:

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

Animal.prototype.sayHello = function() {
  console.log(`Hello, I am a ${this.name}`);
}

function Cat(name) {
  Animal.call(this, name);
  this.type = 'cat';
}

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

const cat = new Cat('小花');

console.log(cat.constructor === Cat); // 输出 true
console.log(cat.sayHello()); // 输出 Hello, I am a cat

在上面的例子中,我们定义了父类 Animal 和子类 Cat。子类 Cat 通过调用父类 Animal 的构造函数来继承父类 Animal。同时,我们还设置了子类 Cat 的原型对象指向父类 Animal 的原型对象,以实现对父类属性和方法的继承。

示例2:__proto__ 和 constructor 的使用

下面是一个使用 __proto__constructor 的示例:

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

function Cat(name) {
  this.type = 'cat';
}

const animal = new Animal('动物');
const cat = new Cat('小花');

cat.__proto__ = animal;

console.log(cat instanceof Animal); // 输出 true
console.log(cat.constructor === Cat); // 输出 true
console.log(cat.__proto__ === animal); // 输出 true

在上面的例子中,我们定义了一个父类 Animal 和一个子类 Cat。然后我们创建了两个对象 animalcat。通过将子类 Cat__proto__ 属性指向父类 Animal,我们让 cat 对象拥有了 Animal 对象的所有属性和方法。同时,我们还可以使用 cat.constructor 来获取 cat 对象的构造函数,可以使用 cat.__proto__ 来获取 cat 对象的原型对象。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一文彻底理解js原生语法prototype,__proto__和constructor - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • ES6中module模块化开发实例浅析

    ES6中module模块化开发实例浅析 在ES6之前,JavaScript并没有原生的模块化机制,开发者们采用了各种方式实现模块化,比如立即执行函数、命名空间等。但这些方式都存在缺点,比如代码可读性差、变量污染等问题。ES6中提供了原生的模块化机制,使得我们可以更加方便、清晰地组织和管理代码。 使用ES6 module规范 ES6中的module规范使用im…

    JavaScript 2023年6月10日
    00
  • 微前端qiankun沙箱实现源码解读

    我们来详细讲解一下“微前端qiankun沙箱实现源码解读”的完整攻略。 什么是微前端 首先,我们需要知道什么是微前端。简单地说,微前端是一种前端架构模式,它将大型Web应用程序分解为较小的、易于管理的模块,这些模块可以独立地开发、测试和部署。每个模块可以由不同的团队开发,并且可以以不同的速度进行更新和发布。这种模式使得公司可以更加灵活地开发和部署前端应用程序…

    JavaScript 2023年6月11日
    00
  • javascript动态加载实现方法一

    首先我们需要明确一下“javascript动态加载”是什么意思。 “javascript动态加载”指的是通过JavaScript在网页运行过程中动态加载(或移除)外部脚本或样式表等资源文件,而不是在HTML中直接使用<script>或<link>标签引用。 接下来我们来介绍一下“javascript动态加载实现方法一”的完整攻略,包括…

    JavaScript 2023年5月27日
    00
  • JavaScript初级教程(第二课)第1/7页

    第一步:Markdown格式化 在发布文章时,请使用Markdown格式化文本以提高可读性和美观性。以下是一份标准的Markdown格式: JavaScript初级教程(第二课) 第1/7页 目录 课程简介 数据类型 变量和常量 运算符 控制流 函数和方法 常见问题解答 课程简介 JavaScript是一种用于网页开发的编程语言。在本课程中,您将学习Java…

    JavaScript 2023年5月18日
    00
  • js打造数组转json函数

    下面给出 JS 打造数组转 JSON 函数的完整攻略。这里的数组指的是 JavaScript 中的数组类型。 前言 JSON(JavaScript Object Notation)是一种轻量级的数据序列化格式,它被广泛应用于 Web 应用程序中的数据交换。在前端开发中,我们通常需要将数据从 JavaScript 中的数组类型转化为 JSON 格式,以便将数据…

    JavaScript 2023年5月27日
    00
  • vue3 vite异步组件及路由懒加载实战示例

    下面我将详细讲解“vue3 vite异步组件及路由懒加载实战示例”的完整攻略。 什么是异步组件及路由懒加载? 异步组件是指在页面加载时不会被立即加载的组件,而是在组件被使用时动态加载。这种技术有助于提高页面加载速度,减少初始化时不必要的开销。 路由懒加载,是指在路由被触发时才下载相关的代码。它可以提高页面加载速度、降低初次加载时的资源消耗。 如何进行异步组件…

    JavaScript 2023年6月11日
    00
  • JS利用map整合双数组的小技巧分享

    JS利用map整合双数组的小技巧是指通过使用map函数,把两个数组逐个对应元素整合成一个新的数组。下面是具体的步骤及示例: 1. 首先明确双数组整合的要求 如果我们有两个数组: const arr1 = [1, 2, 3]; const arr2 = [‘a’, ‘b’, ‘c’]; 我们希望将这两个数组逐个对应元素整合成一个新的数组,即得到: const …

    JavaScript 2023年6月10日
    00
  • JavaScript中的console.profile()函数详细介绍

    JavaScript中的console.profile()函数详细介绍 什么是console.profile()函数? console.profile() 函数是JavaScript中内置的一个控制台函数,它可以用来分析网站性能,定位瓶颈。当执行此函数时,浏览器会在控制台中打开一个新的性能分析面板,记录执行时间、调用堆栈、内存使用情况等详细信息,从而帮助我们…

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