上一主题 下一主题
返回列表 发新帖

JS原型链

[复制链接]

95

主题

277

帖子

700

积分

高级会员

Rank: 4

积分
700
发表于 2021-2-25 18:54:44 | 显示全部楼层 | 阅读模式

本帖最后由 小陈 于 2021-2-25 18:56 编辑

js原型链

首先我们要知道任何对象都有一个proto属性 任何的方法都有prototype属性,prototype也是一个对象,也是有proto属性的

image.png

定义一个函数fn,调试出它的prototype属性,可以看到结果中有constructor和proto

constructor指向函数自己。同时可以看见prototype中也有proto

JS创建对象

第一种是通过构造函数创建对象

var obj=new Object();

第二种是object.create创建对象

var obj1={};
var obj2= Object.create(obj1);

第三种花括号创建

var obj={};

所有的对象中都有proto属性,这个属性就是一个指针,指向构造函数中的prototype属性。

image.png

所有对象的proto指向创建它们的构造函数的prototype

image.png

我们验证一下。

image.png

image.png

总结

1函数对象有proto和prototype属性 2非函数对象只有proto属性 3prototype中有proto属性。且是Object构造函数创建的 4函数对象proto指向它的创建者及Function构造函数 5Function构造函数proto指向它自己 6Object对象的prototype中的proto是null

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
Vx:rsnhkx2015  公众号:陈公子的话
回复

使用道具 举报

95

主题

277

帖子

700

积分

高级会员

Rank: 4

积分
700
发表于 2021-2-25 19:55:34 | 显示全部楼层
首先知道javascript所有对象都是object实例,并且继承Object.prototype的属性和方法

当我们定义函数a的时候,会自动生成一个prototype对象,那prototype对象,它是对象他就有__proto__属性,那函数a.prototype.__proto__其实就是Object.prototype

当我们定义一个对象b的时候,会自动生成__proto__属性,那么b.__proto__其实就是构造函数B.prototype   再延伸一下B.prototype.__proto__又回到我们说的Object.prototype

原型链是什么呢   

对象都有toString这个方法,就像上面说的实例化对象b,b本身没有tostring这个方法,然后通过__proto__方法向上延伸,b.__proto__其实就是B.prototype,构造函数B也没tostring这个方法,继续通过__proto__向上找,B.prototype.__proto__也就是Object.prototype有tostring这个方法 ,实例化对象b才继承了这个方法

这个过程中Object.prototype = b.__proto__.__proto__
Vx:rsnhkx2015  公众号:陈公子的话
回复

使用道具 举报

82

主题

556

帖子

771

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
771
发表于 2021-2-26 00:24:28 | 显示全部楼层
考试题:
function CreateObj(){
this.a=888;
}
var a=new CreateObj
a.__proto__===?
CreateObj.prototype.__proto__===?
CreateObj.__proto__===?
Function.__proto__===?
回复

使用道具 举报

95

主题

277

帖子

700

积分

高级会员

Rank: 4

积分
700
发表于 2021-2-26 15:20:18 | 显示全部楼层
a.__proto__ ===CreatObj.prototype
CreateObj.prototype.__proto__=== Object.prototype
CreateObj.__proto__=== CreateObj.constructor.prototype
Function.__proto__===Function.prototype
Vx:rsnhkx2015  公众号:陈公子的话
回复

使用道具 举报

95

主题

277

帖子

700

积分

高级会员

Rank: 4

积分
700
发表于 2021-2-26 15:28:20 | 显示全部楼层
CreateObj.__proto__=== CreateObj.constructor.prototype===Function.__proto__===Function.prototype
Vx:rsnhkx2015  公众号:陈公子的话
回复

使用道具 举报

95

主题

277

帖子

700

积分

高级会员

Rank: 4

积分
700
发表于 2021-2-26 15:33:59 | 显示全部楼层
a.__proto__ ===a.constructor.prototype===CreatObj.prototype
Vx:rsnhkx2015  公众号:陈公子的话
回复

使用道具 举报

82

主题

556

帖子

771

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
771
发表于 2021-2-26 18:44:15 | 显示全部楼层
小陈 发表于 2021-2-26 15:33
a.__proto__ ===a.constructor.prototype===CreatObj.prototype

ggnb!
回复

使用道具 举报

发表回复

本版积分规则

快速回复 返回顶部 返回列表