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

一文彻底理解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日

相关文章

  • javascript实现获取服务器时间

    获取服务器时间是Web开发中经常用到的一个功能,javascript可以通过AJAX技术向服务器发送请求获取服务器时间。以下是获取服务器时间的完整攻略: 步骤1. 创建一个API 首先,需要在服务器端创建一个API,用于返回服务器当前时间。API的地址可以是一个后端程序文件或者一个接口。 以php为例,可以通过以下代码实现: <?php header(…

    JavaScript 2023年5月27日
    00
  • 如何快速高效创建JavaScript 一维数组方法详解

    当我们需要存储一组相关数据时,数组是JavaScript中最常用的数据类型之一。创建JavaScript一维数组非常简单,我们只需要将不同的数值或字符串用逗号隔开即可。但是,当数组中数据很多时,我们需要更高效,更便利地来创建数组。 下面是创建JavaScript一维数组的一些方法详解。 1. 直接赋值法 这是最基本的方法,我们可以直接在代码中定义值为数组类型…

    JavaScript 2023年5月27日
    00
  • JavaScript基础之运算符

    JavaScript基础之运算符 在 JavaScript 中,我们可以使用不同的运算符对各种数据类型进行各种操作。下面介绍几种常用的运算符。 算术运算符 算术运算符用于操作数字类型的数据。 加号(+) 加号用于加法运算。 let a = 1, b = 2; let c = a + b; // c = 3 减号(-) 减号用于减法运算。 let a = 2,…

    JavaScript 2023年5月18日
    00
  • JS动态添加与删除select中的Option对象(示例代码)

    下面我将详细讲解如何通过JavaScript动态地添加和删除<select>元素中的<option>元素。 1. 添加<option>元素 通过JavaScript动态地往<select>元素中添加<option>元素,可以用以下代码: // 获取<select>元素 var selec…

    JavaScript 2023年6月10日
    00
  • Web Animations API实现一个精确计时的时钟示例

    要实现一个精确计时的时钟示例,我们可以使用Web Animations API。这项API可以让我们通过JavaScript来控制CSS动画,而且可以精确定时。下面是实现的步骤: 步骤一:编写HTML代码 编写一个包含时钟的div元素和三个子元素的HTML结构,分别对应时针、分针和秒针。 <div class="clock">…

    JavaScript 2023年6月11日
    00
  • Js实现粘贴上传图片的原理及示例

    让我来为你讲解Js实现粘贴上传图片的原理及示例的完整攻略。 原理 Js实现粘贴上传图片的原理为通过监听粘贴事件,获取粘贴板中的内容,如果内容是图片,则将其转换为base64格式上传到服务器。 具体来说,通过监听粘贴事件 paste ,获取事件对应的粘贴板对象 clipboardData 中的内容,如果内容是图片,则将其转换为base64编码。然后,使用Aja…

    JavaScript 2023年5月19日
    00
  • JavaScript闭包函数访问外部变量的方法

    下面就是关于“JavaScript闭包函数访问外部变量的方法”的详细讲解,包含完整的攻略和示例说明。 闭包的定义 简单来说,闭包是指函数可以访问其定义时所处的作用域以外的变量。这样的函数不仅可以访问自己的局部变量,还可以访问它外层函数的变量。 闭包的优点 闭包可以在函数内定义变量,并使这些变量对函数外部不可见,从而隐藏实现细节。另外,由于闭包可以访问其定义时…

    JavaScript 2023年6月10日
    00
  • JS实现清除指定cookies的方法

    清除指定的cookie,可以使用以下JS代码: function clearCookie(name) { document.cookie = name + ‘=;expires=Thu, 01 Jan 1970 00:00:01 GMT;’; } 此代码中,我们定义了一个clearCookie函数,这个函数需要传递一个cookie名作为参数。在函数内部,我们…

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