图文解析原型链

本文介绍了JavaScript中函数对象和普通对象的原型属性,重点解析了_prototype_和prototype的区别,以及原型链的工作原理。通过示例展示了如何通过原型链调用方法。同时,文章还探讨了对象如何调用内置方法如toString(),并解释了调用过程。最后提到了真数组和伪数组的判断依据,并提供了一个关于数组方法push()调用的实例。

【构造函数、原型对象、实例对象之间的关系图】
1、显式原型:prototype 隐式原型:proto

2、js对象分为【函数对象】和【普通对象】,_proto_是普通对象的属性,prototype是函数对象才有的属性;

3、prototype指向一块【内存】,内存里有【公用的属性】,而_proto_指向同一块内存;

4、js是【基于原型】的语言,当调用一个对象的的属性时,如果对象没有该属性,就会去找原型的属性,如果没有,则会去找原型的原型的属性,直到最后返回null为止,null没有原型,这种查找方式成为【原型链】;

带着以上四句话去理解这个栗子:

var test = function () {   // 函数对象test
    this.propA = 'hello';
    this.methodA = function() {
        return this.propA; // this指向调用methodsA的对象,即objA,objA.propA = ‘hello’
    }
}

test.prototype = {
    methodB: function() {
        return this.propA; // this指向调用test.prototype的对象,即objA
    }
}

var objA = new test();

objA.methodA() // hello
objA.methodB() // hello


下面,升级一点难度
一、为什么obj可以调用toString()方法呢?

let obj = {}
obj.toString()

1、js代码运行之前,就存在window对象,该对象有Object属性,window.Object是一个函数对象

2、window.Object这个函数对象具有prototype属性,指向window.Object.prototype对象;

3、window.Object.prototype具有toString()和valueOf()这两个方法;

4、obj.toString() 等价于 obj.toString.call(obj) 等价于 window.Object.prototype.call(obj)

二、由同理可得,arr可以调用push()方法

let arr = []
arr.push(1)

在这里插入图片描述
ps:真数组与伪数组区别:

如果一个数组的_proto_直接或间接指向Array.prototype,则是真数组,否则为伪数组

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值