JavaScript原型链详解
作者:在下月亮有何贵干 发布时间:2024-04-19 09:44:42
1、构造函数和实例
假设你声明一个方法叫做Foo()
,那么我们可以通过new Foo()
来声明实例。
function Foo() {
console.log("我是一个构造方法");
}
const f1 = new Foo();
现在你可以很清晰的明白Foo()
是构造函数,f1
是它的实例。
2、属性Prototype
Foo()
这个构造函数是一个方法。
方法也是对象数据类型,所以可以说方法是个对象。
对象就有属性,不过方法有自己特殊的一个属性,叫做prototype
,其他对象没有哦。
这个属性会指向一个原型对象(Foo.prototype
),而原型对象也会有一个自己的属性叫做constructor
,指向属性包含了一个指针,指回原构造函数。
function Foo() {
console.log("我是一个构造方法");
}
const f1 = new Foo();
console.log(Foo.prototype);//Foo的原型对象
console.log(f1.prototype);//f1没有 underfied
3、属性__proto__
上文的prototype
是给构造函数的所有实例提供共享方法和属性的。
实例又是怎么访问到共享方法和属性的呢?
f1实例没有prototype
,而有一个属性__proto__,
这是所有对象都有的属性,它指向到构造自己的构造函数的原型对象,然后js这个语言就是根据这个属性来让实例访问到共享属性和方法的
Foo是f1的构造函数,Foo.prototype
是Foo
的原型对象,所以f1.__proto__
指向Foo.prototype
function Foo() {
console.log("我是一个构造方法");
}
const f1 = new Foo();
console.log(Foo.prototype);
console.log(f1.__proto__);
4、访问原型上的方法
Foo这个构造函数如果希望自己的实例能够拥有同一个属性,比如name
,就在自己的原型对象上加上。
function Foo() {
console.log("我是一个方法");
}
Foo.prototype.name = "我是Foo创造的实例共享的属性";
const f1 = new Foo();
const f2 = new Foo();
console.log(f1.name);//我是Foo创造的实例共享的属性
console.log(f2.name);//我是Foo创造的实例共享的属性
5、构造函数也有__proto__
上面说所有对象都有__proto__
,Foo是函数也是对象啊,所以Foo.__proto__
是啥呢?
那就去找Foo的构造函数是谁呢,Foo是一个函数,拥有函数特有的方法和属性,创造的它的构造函数就是Function,这个js自带的的一个构造函数,它的Function.prototype
给所有js中你创建的函数提供函数自带的一些公共方法和属性。
所以Foo.__proto__
指向Funtion.prototype
6、构造函数的原型也有__proto__
Foo.prototype
也是对象,所以它也有__proto__。
每当我们要找__proto__,
就得找它的构造函数,Foo.prototype
是个对象,纯对象,所以它的构造函数是Object,那么Object的原型就是Object.prototype。
Foo.prototype.__proto__
指向Object.prototype
7、Object.prototype这个原型对象很特殊
Array
、String
、Funtion
、Object
这些构造函数都是函数,
都是Funtion构造函数的实例,Array.__proto__
、String.__proto__
、Funtion.__proto__
、Object.__proto__
指向Funtion.prototype
原型,
可以调用Funtion.prototype
原型的一些公共方法,
例如都可以调用.name
查看自己的函数名字。
Array.prototype
、String.prototype
、Funtion.prototype
这些原型对象都是对象,
都是Object构造函数的实例,Array.prototype.__proto__
、String.prototype.__proto__
、Funtion.prototype.__proto__
指向Object.prototype
原型,
所以可以调用Object.prototype
这个原型对象的公共方法,
而Object.prototype
有些特殊,它虽然是对象,但是并不是Object自己的实例,Object.prototype.__proto__
指向null,作为原型链的终点
8、总结
方法,也就是函数,才有prototype
,就是方法的原型。
所以实例,一般都会有个对应的构造方法,也就是构造函数,实例的__proto__
指向构造方法的原型。
js有很多自带的构造方法,例如Array
、String
、Funtion
、Object
,都是根据js一些对象类型分配的,他们的原型上提供了许多封装好的常用方法。
所有构造方法本身是函数,是Funtion
这个js自带构造函数的实例。
除了Object.prototype
,所有构造方法的原型本身是对象,是Object这个js自带构造函数的实例。Object.prototype.__prototype
指向null,作为原型链终点。
来源:https://www.cnblogs.com/yueliangna/p/15480831.html


猜你喜欢
- 1.筛选出目标值所在行 单列筛选# df[列名].isin([目标值])对当前列中存在目标值的行会返回True,不存在的返回Fal
- XML和XSLT的转换使Web设计受益无穷。借助XML和 XSLT转换,你可以实现将动态用语(dynamic verbiage)和网站内容存
- Python是一种面向对象的解释型计算机程序设计语言。Python是纯粹的自由软件, 源代码和解释器CPython遵循 GPL(GNU Ge
- 小编使用python中的django框架来完成!1,首先用pycharm创建django项目并配置相关环境这里小编默认项目都会创建setti
- 本文实例为大家分享了python图形用户接口实例的具体代码,供大家参考,具体内容如下运用tkinter图形库,模拟聊天应用界面,实现信息发送
- 一、find_element_by_id()find_element_by_id()1.从上面定位到的元素属性中,可以看到有个id属性:id
- QSplitter使用户可以通过拖动子面板的边界控制子面板的大小。在我们的例子中,我们使用了两个QSplitter 对三个QFrame 控件
- 本文实例讲述了Python判断Abundant Number的方法。分享给大家供大家参考。具体如下:Abundant Number,中文译成
- 原作者:Jason MannInternet Magazine showed that people do not read on the
- 直接上码:select 'bigint unsigned' as type ,'8' as bytes ,~
- 关联2张表时出现了无法创建外键的情况,从这个博客看到,问题出在第六点的Charset和Collate选项在表级和字段级上的一致性上。我的2张
- 学习前言看了好多Github,用于保存模型的库都是Keras,我觉得还是好好学习一下的好什么是KerasKeras是一个由Python编写的
- 现将几种主要情况进行小结: 一、如何输入NULL值 如果不输入null值,当时间为空时,会默认写入"1900-01-01"
- 在本文中,小编将与大家重点探讨SQL执行进展优化的方法。聚集索引扫描SELECT * FROM C_SY_Ownedstorm 聚集索引扫描
- 1.order by rand()数据多了极慢,随机性非常好,适合非常小数据量的情况。SELECT * FROM table_name AS
- Django的核心(1.4+)可以运行在从2.5到2.7之间的任何Python版本。我的电脑是操作系统是window10 ,内存是4G。1。
- 这些日子,几乎每个人都在谈论XML (Extensible Markup Language),但是很少有人真正理解其含义。XML的推崇者认为
- 本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下<!DOCTYPE html><htm
- 解决方法: 给 audio 组件绑定点击事件,手动触发播放暂停方法!代码片段:wxml文件<!-- 判断是语音通话,有通话记录,通话描
- 本文实例讲述了动态规划之矩阵连乘问题Python实现方法。分享给大家供大家参考,具体如下:给定n个矩阵{A1,A2,…,An},其中Ai与A