JS 理解记录(函数原型与原型链)

在了解函数原型之前,先由构造函数来进行引入:

    //定义构造函数Plant
    function Plant(name) {
        this.name = name;
    }

    //实例化函数
    let flower = new Plant('rose');  

在尝试打印 flower 这个函数之后,会发现其存在一个浅色的属性:
打印

1.__proto__ (隐式原型)

该属性为 flower 函数的内部属性。其指向的是一个对象,而这个对象也就是他的原型:构造函数 Plant 。然而

console.log(flower.__proto__ === Plant);//false

因为其指向的是 Plant 这个构造函数的原型。

2.prototype (显式原型)

注:此属性为函数特有

而我们要找到 Plant 这个构造函数的原型,就需要用到 prototype 这个属性。prototype 属性所代表的即是构造函数 Plant 的原型对象。当利用构造函数实例化对象时,prototype属性的值将会赋予给实例化对象的 __proto__ 属性。故:

console.log(flower.__proto__ === Plant.prototype);//true

当我们再实例化一个函数对象:

let tree = new Plant('bigTree');
console.log(tree.__proto__ === Plant.prototype);//true

由此佐证:Plant函数对象为两个实例化函数对象的“原型”。

3.原型链

我们再追根述源,Plant这一构造函数,也是归于Object这一数据类型,那么Objectprototype属性,是否赋予给了Plant__proto__属性呢?

console.log(Object.prototype === Plant.__proto__);//false
console.log(Object.prototype === Plant.prototype.__proto__);//true

由上可知,Objectprototype属性值是赋予给了Plant这个函数对象原型的,Plant所存储的内部指针,便是指向Object这一原型对象。

而要是再往上:

console.log(Object.prototype.__proto__ ) // null

prototype (显式原型)均包含一个指向构造函数的指针,而__proto__ (隐式原型)均包含一个指向原型对象的内部指针

不难发现,由各项实例到Object对象原型,其间都在传递着指向相应原型对象的指针,而正是这个__proto__属性构成了原型链的基础结构

结语:

此文为初步认识函数原型与原型链,可能存在诸多不足,特此记录,以供来日翻阅。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值