我的编程空间,编程开发者的网络收藏夹
学习永远不晚

怎么使用Javascript的prototype链

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

怎么使用Javascript的prototype链

这篇文章主要介绍“怎么使用Javascript的prototype链”,在日常操作中,相信很多人在怎么使用Javascript的prototype链问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使用Javascript的prototype链”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

我们知道,在Js中一切皆为对象(Object),但是Js中并没有类(class);Js是基于原型(prototype-based)来实现的面向对象(OOP)的编程范式的,但并不是所有的对象都拥有  prototype 这一属性:

var a = {};

console.log(a.prototype); //=> undefined

var b = function(){};

console.log(b.prototype); //=> {}

var c = 'Hello';

console.log(c.prototype); //=> undefined

prototype 是每个 function 定义时自带的属性,但是Js中 function 本身也是对象,我们先来看一下下面几个概念的差别:

function 、 Function 、 Object 和 {}

function 是Js的一个关键词,用于定义函数类型的变量,有两种语法形式:

function f1(){

console.log('This is function f1!');

}

typeof(f1); //=> 'function'

var f2 = function(){

console.log('This is function f2!');

}

typeof(f2); //=> 'function'

如果用更加面向对象的方法来定义函数,可以用 Function :

var f3 = new Function("console.log('This is function f3!');");

f3(); //=> 'This is function f3!'

typeof(f3); //=> 'function'

typeof(Function); //=> 'function'

实际上 Function 就是一个用于构造函数类型变量的类,或者说是函数类型实例的构造函数(constructor);与之相似有的 Object 或  String 、 Number 等,都是Js内置类型实例的构造函数。比较特殊的是 Object ,它用于生成对象类型,其简写形式为 {} :

var o1 = new Object();

typeof(o1); //=> 'object'

var o2 = {};

typeof(o2); //=> 'object'

typeof(Object); //=> 'function'

prototype VS __proto__

清楚了上面的概念之后再来看 prototype :

Each function has two properties: length and prototype

prototype 和 length  是每一个函数类型自带的两个属性,而其它非函数类型并没有(开头的例子已经说明),这一点之所以比较容易被忽略或误解,是因为所有类型的构造函数本身也是函数,所以它们自带了  prototype 属性:

// Node

console.log(Object.prototype); //=> {}

console.log(Function.prototype);//=> [Function: Empty]

console.log(String.prototype); //=> [String: '']

除了 prototype 之外,Js中的所有对象( undefined 、 null 等特殊情况除外)都有一个内置的 [[Prototype]]  属性,指向它“父类”的 prototype ,这个内置属性在ECMA标准中并没有给出明确的获取方式,但是许多Js的实现(如Node、大部分浏览器等)都提供了一个  __proto__ 属性来指代这一 [[Prototype]] ,我们通过下面的例子来说明实例中的 __proto__ 是如何指向构造函数的  prototype的:

var Person = function(){};

Person.prototype.type = 'Person';

Person.prototype.maxAge = 100;

var p = new Person();

console.log(p.maxAge);

p.name = 'rainy';

Person.prototype.constructor === Person; //=> true

p.__proto__ === Person.prototype; //=> true

console.log(p.prototype); //=> undefined

上面的代码示例可以用下图解释:

Person 是一个函数类型的变量,因此自带了 prototype 属性, prototype 属性中的 constructor 又指向 Person  本身;通过 new 关键字生成的 Person 类的实例 p1 ,通过 __proto__ 属性指向了 Person 的原型。这里的 __proto__  只是为了说明实例 p1 在内部实现的时候与父类之间存在的关联(指向父类的原型),在实际操作过程中实例可以直接通过 .  获取父类原型中的属性,从而实现了继承的功能。

原型链

清楚了 prototype 与 __proto__ 的概念与关系之后我们会对“Js中一切皆为对象”这句话有更加深刻的理解。进而我们会想到,既然  __proto__ 是(几乎)所有对象都内置的属性,而且指向父类的原型,那是不是意味着我们可以“逆流而上”一直找到源头呢?我们来看下面的例子:

// Node

var Obj = function(){};

var o = new Obj();

o.__proto__ === Obj.prototype; //=> true

o.__proto__.constructor === Obj; //=> true

Obj.__proto__ === Function.prototype; //=> true

Obj.__proto__.constructor === Function; //=> true

Function.__proto__ === Function.prototype; //=> true

Object.__proto__ === Object.prototype; //=> false

Object.__proto__ === Function.prototype; //=> true

Function.__proto__.constructor === Function;//=> true

Function.__proto__.__proto__; //=> {}

Function.__proto__.__proto__ === o.__proto__.__proto__; //=> true

o.__proto__.__proto__.__proto__ === null; //=> true

从上面的例子和图解可以看出, prototype 对象也有 __proto__ 属性,向上追溯一直到 null 。

new 关键词的作用就是完成上图所示实例与父类原型之间关系的串接,并创建一个新的对象; instanceof  关键词的作用也可以从上图中看出,实际上就是判断__proto__ (以及 __proto__.__proto__ …)所指向是否父类的原型:

var Obj = function(){};

var o = new Obj();

o instanceof Obj; //=> true

o instanceof Object; //=> true

o instanceof Function; //=> false

o.__proto__ === Obj.prototype; //=> true

o.__proto__.__proto__ === Object.prototype; //=> true

o.__proto__.__proto__ === Function; //=> false

到此,关于“怎么使用Javascript的prototype链”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

怎么使用Javascript的prototype链

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

怎么使用Javascript的prototype链

这篇文章主要介绍“怎么使用Javascript的prototype链”,在日常操作中,相信很多人在怎么使用Javascript的prototype链问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使用Jav
2023-06-17

JavaScript原型Prototype怎么使用

这篇文章主要讲解了“JavaScript原型Prototype怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript原型Prototype怎么使用”吧!1、概述1.1原型
2023-06-21

JavaScript函数及prototype怎么使用

这篇文章主要介绍“JavaScript函数及prototype怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JavaScript函数及prototype怎么使用”文章能帮助大家解决问题。一、
2023-07-05

JS中prototype怎么使用

在 JavaScript 中,每个对象都有一个 `prototype` 属性,可以通过 `Object.prototype` 来访问。`prototype` 属性是一个指向原型对象的指针,它包含了共享给所有实例对象的属性和方法。通过原型对象
2023-08-18

JavaScript中的可选链怎么使用

这篇文章主要介绍“JavaScript中的可选链怎么使用”,在日常操作中,相信很多人在JavaScript中的可选链怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JavaScript中的可选链怎么使用
2023-07-06

JavaScript Date prototype属性有什么用

JavaScript 中的 Date 对象是用于处理日期和时间的对象。 Date 对象有很多方法和属性可以进行日期和时间的操作。其中,Date 对象的 prototype 属性用于向对象添加属性和方法。通过给 Date 对象的 protot
2023-10-12

JavaScript Boolean prototype属性有什么用

JavaScript中的Boolean构造函数有一个名为prototype的属性,它是一个对象,它允许您向Boolean对象添加新的属性和方法。使用Boolean.prototype属性,您可以向所有Boolean对象实例共享和重用的属性和
2023-10-11

JavaScript作用域链是什么及怎么使用

这篇文章主要介绍了JavaScript作用域链是什么及怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇JavaScript作用域链是什么及怎么使用文章都会有所收获,下面我们一起来看看吧。1. 作用域是什么
2023-07-04

javascript原型链的使用方式

这篇文章主要讲解了“javascript原型链的使用方式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“javascript原型链的使用方式”吧!说明1、原型中包含的引用值将在所有实例之间共享
2023-06-20

Ajax框架Prototype 1.7 RC1怎么用

这篇文章主要讲解了“Ajax框架Prototype 1.7 RC1怎么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Ajax框架Prototype 1.7 RC1怎么用”吧!Prototy
2023-06-17

javascript怎么隐藏链接

这篇文章主要介绍“javascript怎么隐藏链接”,在日常操作中,相信很多人在javascript怎么隐藏链接问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”javascript怎么隐藏链接”的疑惑有所帮助!
2023-07-06

javascript原型链继承的使用方法

这篇文章主要讲解了“javascript原型链继承的使用方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“javascript原型链继承的使用方法”吧!说明1、即使不自定义类型,也可以通过原
2023-06-20

js中prototype的作用是什么

在JavaScript中,prototype是一个对象,它包含了共享给所有实例对象的属性和方法。每个JavaScript对象都有一个prototype属性,它指向另一个对象。prototype的作用是通过原型继承来共享属性和方法。当访问一个
2023-08-18

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录