Javascript 原型与原型链深入详解

yizhihongxing

Javascript 原型与原型链深入详解

原型

在JavaScript中,每一个对象都有一个指向其原型的属性,称之为 __proto__,原型本身也是一个对象。在Javascript中使用函数构造对象时,函数本身也有一个原型属性,称之为 prototype。我们可以使用 Object.getPrototypeOf() 方法实现查找一个对象的原型。比如:

let arr = [1, 2, 3];
let arrProto = Object.getPrototypeOf(arr);
console.log(arrProto); //输出:[object Array]

通过查找到原型,我们可以发现,arr 的原型是一个 Array 对象。

原型链

原型链是基于原型的一个特性。每一个对象都有原型,原型也是对象,也有原型,这样随着原型的递归查找,我们就得到了一个原型链。在Javascript中,我们可以通过以下方式实现查找原型链:

let arr = [1, 2, 3];
let arrProto = Object.getPrototypeOf(arr);
let arrProtoProto = Object.getPrototypeOf(arrProto); //获取原型的原型
console.log(arrProto); // [object Array]
console.log(arrProtoProto); // [object Object], 最终的原型为 Object.prototype

在这个例子中,我们可以看到,arrProto 对象的原型是 Array.prototypeArray.prototype 的原型是 Object.prototype,这就形成了一个原型链。

原型继承

在Javascript中,对象的属性可以继承自它的原型,我们称之为原型继承。在创建一个对象时,我们可以将该对象的原型指向任何一个对象。比如,我们可以通过以下方式实现:

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

let personProto = {
    sayHello:function() {
        console.log(`Hello ${this.name}`);
    }
};

Person.prototype = personProto;

let tom = new Person('Tom');
tom.sayHello(); //输出:Hello Tom

在这个例子中,我们创建了一个 Person 函数以及一个 personProto 对象,然后将 Person.prototype 指向 personProto,这就意味着所有使用 new Person() 创建的对象都将继承 personProto 对象中的属性和方法。

示例说明

示例一

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

Animal.prototype.sayName = function() {
    console.log(`My name is ${this.name}`);
}

function Dog(name, color) {
    Animal.call(this, name);
    this.color = color;
}

Dog.prototype = Object.create(Animal.prototype); //继承 Animal的原型
Dog.prototype.constructor = Dog; //重置构造函数为 Dog

Dog.prototype.bark = function() {
    console.log('Woof!');
}

let dog = new Dog('Buddy', 'Golden');
dog.sayName(); // 输出:"My name is Buddy"
dog.bark(); // 输出:"Woof!"

在这个例子中,我们创建了一个 Animal 函数,使用 Animal.prototype 创建一个原型,并绑定一个 sayName 方法。然后我们创建了一个 Dog 函数,并调用 Animal.call(this, name) 来实现其属性继承。然后我们使用 Object.create(Animal.prototype) 来创建一个新的 Dog 原型,并继承 Animal.prototype,最后重置构造函数为 Dog

示例二

class Animal {
    constructor(name) {
        this.name = name;
    }

    sayName() {
        console.log(`My name is ${this.name}`);
    }
}

class Dog extends Animal {
    constructor(name, color) {
        super(name);
        this.color = color;
    }

    bark() {
        console.log('Woof!');
    }
}

let dog = new Dog('Buddy', 'Golden');
dog.sayName(); // 输出:"My name is Buddy"
dog.bark(); // 输出:"Woof!"

在这个例子中,我们使用ES6的 class 语法创建了一个 Animal 类,和一个 Dog 类,并使用 extends 实现 Dog 对象继承 Animal 类。最后我们创建了一个 Dog 实例并调用其方法。

总结

原型与原型链是Javascript中非常重要的一部分,可以用于实现继承等功能,同时原型链也是Javascript中一个非常特殊的机制。我们需要掌握原型及其链的概念和实现方法,并应用到实际的代码中去。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Javascript 原型与原型链深入详解 - Python技术站

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

相关文章

  • 利用d3.js制作连线动画图与编辑器的方法实例

    利用d3.js制作连线动画图步骤如下: 第一步:安装d3.js库文件 要使用d3.js库进行开发,需要将d3.js的库文件下载到本地,然后在HTML文档中引入该文件。 <script src="https://d3js.org/d3.v5.min.js"></script> 第二步:创建SVG容器 使用d3.js创…

    JavaScript 2023年6月10日
    00
  • javascript 有用的脚本函数

    下面是详细讲解“javascript 有用的脚本函数”的完整攻略。 一、概述 JavaScript 是一种广泛应用的脚本语言,已经成为网页开发中必不可少的一部分。在 JavaScript 中,函数是一个非常重要的概念,它可以使代码更加模块化、易读、易维护、易扩展。 本文将提供一些有用的 JavaScript 函数,这些函数可以提高你的代码质量,把你的网站变得…

    JavaScript 2023年5月27日
    00
  • 使用Post提交时须将空格转换成加号的解释

    在使用POST方式提交表单的时候,浏览器默认会将表单数据按照key/value的形式进行编码,并以”application/x-www-form-urlencoded”的格式提交到服务器端。其中,key/value间以等号(=)连接,每组key/value间使用&符号分隔。因此,如果表单数据中存在空格等特殊字符,可能会导致数据被编码后出现错误,不能正…

    JavaScript 2023年6月10日
    00
  • 100多个基础常用JS函数和语法集合大全

    100多个基础常用JS函数和语法集合大全 简介 本文是一篇关于JavaScript函数和语法的大全,涵盖了100多个常见的、基础的JavaScript函数和语法,并包含了详细的示例和用法,旨在帮助初学者和进阶者掌握JavaScript的基本知识。 常见函数 1. alert() alert() 是一个经典的JavaScript函数,用于弹出一个消息框,通常用…

    JavaScript 2023年5月27日
    00
  • 如何动态的导入js文件具体该怎么实现

    动态导入 JavaScript 文件有多种方式实现,其中比较常用的有使用 import() 方法和插入 script 标签两种方法。 使用 import() 方法 import() 方法是 ES6 引入的动态导入模块的方式,通过加载模块的 Promise 对象进行引入。可以在任意位置调用该方法,实现按需加载 JavaScript 文件,适用于较大、复杂或是异…

    JavaScript 2023年5月27日
    00
  • 如何利用PHP 快速解决跨域问题

    下面是如何利用PHP快速解决跨域问题的完整攻略: 什么是跨域问题 首先,我们需要了解一下什么是跨域问题。当客户端使用js等脚本语言向另一个域名或IP地址发起请求时,如果目标域名与客户端当前域名不同,就会遇到跨域问题。出于安全的考虑,浏览器限制了这种跨域请求,导致请求失败。 解决跨域问题的方法 解决跨域问题的方法有很多,其中比较常用的有jsonp、cors和p…

    JavaScript 2023年6月11日
    00
  • javascript 10进制和62进制的相互转换

    让我们来详细讲解一下JavaScript中10进制和62进制的相互转换的攻略。 10进制转62进制 将10进制转换为62进制的过程可以分为三步: 将10进制数字不断除以62,记录余数,直到结果为0; 将余数与62个基本字符进行映射,得到对应的字符; 将所有字符倒序排列得到62进制字符串。 下面是代码示例: /** * 将10进制数字转换为62进制字符串 * …

    JavaScript 2023年5月19日
    00
  • 通俗易懂地解释JS中的闭包

    下面重点来解释一下“JS中的闭包”的相关知识点。 什么是闭包 闭包(Closure)是一种内部函数可以访问外部函数作用域中变量的特殊函数形式。一种理解是,闭包就是能够读取其他函数内部变量的函数。在js中,要理解闭包,就必须要理解作用域链。 当js代码执行时,每个函数都会创建自己的作用域,而在函数内部创建的作用域可以访问外部变量,在外部创建的作用域无法访问内部…

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