当前位置:网站首页>原型链继承
原型链继承
2022-07-06 09:29:00 【社会你磊哥,命硬不弯腰】
在原型链跌了好几次跟头,今天将其归类稍加总结一下。在js中,对象都有__proto__属性,一般这个是被称为隐式的原型,该隐式原型指向构造该对象的构造函数的原型。在js中,一切皆对象,对象则可通过构造函数和字面量的形式生成。
首先我们要扒一扒proto、prototype、constructor
__proto__
:事实上就是原型链指针!真正指向了祖先级对象。
prototype
:这个是指向构造函数的原型对象,其实原型对象就只是个普通对象,里面存放着所有实例对象需要共享的属性和方法!
constructor
:每一个原型对象都包含一个指向构造函数的指针,就是constructor
在这里有一个小技巧帮助我们判断,当求一个对象__proto__是谁的时候,我们首先要想他是那个构造函数new出来的,它指向的就是此构造函数的prototype原型对象。还有就是哪个构造函数要求prototype,比如Array.prototype
是等于[].__proto__
的,还有就是函数也是new Function()
出来的对象。
下面这个图可以帮助我们很好的理解原型链的整个知识点
// Foo.__proto__因为是通过new Function()创建,所以指向Function.prototype
// Foo.prototype指向自己的原型对象,和foo.__proto__相同
// Object,Array,Function都是通过Function构造函数new出来的,所以其__proto__指向Function.prototype
// Function.prototype => Function.prototype.__proto__ = Object.prototype => Object.prototype.__proto__ = null
//底下的运行结果都是true
console.dir(Foo.__proto__ == Function.prototype);
console.dir(Foo.__proto__.__proto__ == Object.prototype);
console.dir(Function.prototype.__proto__ == Object.prototype)
console.dir(Foo.prototype == foo.__proto__);
console.dir(Foo.__proto__.__proto__ == obj.__proto__);
console.dir(Function.prototype == Object.__proto__)
console.dir(Array.__proto__ == Function.prototype);
console.dir(Function.__proto__ == Function.prototype);
console.dir(foo.__proto__.__proto__ == Object.prototype)
附带几个面试题与君共赏
题目一
var F = function () {
}
Object.prototype.a = function () {
}
Function.prototype.b = function () {
}
var f = new F()
方法f只能调用a,不能到用b,F可以调用a方法和b方法,因为f.__proto__
并没有经过Function.prototype
这条链路
题目二
function Parent(){
this.a = 'Parent'
}
function Tom() {
this.a = 'Tom'
}
Parent.__proto__.print = function(){
console.log(this.a)
}
Parent.print()
Tom.print()
var child = new Parent()
child.print()
// undefined
// undefined
// Uncaught TypeError: child.print is not a function
Parent
和Tom
都是Function
的实例,因此相当于在Function.prototype
上面挂载了一个print
方法,因此Parent.print()
可以调用到这个方法,但是没有返回值,一个原因是 Parent
方法没有执行,一个是因为this此时指向的是Parent
,Parent
方法上没有a
属性,而child本身是基于构造函数创建了一个对象,child.__proto__.__proto__ === Object.prototype
,因此在其原型链上找不到print
方法。
边栏推荐
猜你喜欢
字节跳动技术新人培训全记录:校招萌新成长指南
Data config problem: the reference to entity 'useunicode' must end with ';' delimiter.
Mp4 format details
Solve the problem that intel12 generation core CPU single thread only runs on small cores
How to configure hosts when setting up Eureka
~79 Movie card exercise
~73 other text styles
Solr standalone installation
Story of [Kun Jintong]: talk about Chinese character coding and common character sets
Chapter 7__ consumer_ offsets topic
随机推荐
Chapter 5 namenode and secondarynamenode
7-5 blessing arrived
Introduction to microservices
LeetCode 1545. Find the k-th bit in the nth binary string
Error: case label `15 'not within a switch statement
LeetCode 1638. Count the number of substrings with only one character difference
字节跳动新程序员成长秘诀:那些闪闪发光的宝藏mentor们
Codeforces Round #771 (Div. 2)
@RequestMapping、@GetMapping
Educational Codeforces Round 122 (Rated for Div. 2)
The concept of spark independent cluster worker and executor
LeetCode 1637. The widest vertical area between two points without any point
第一章 MapReduce概述
Spark independent cluster dynamic online and offline worker node
Cmake Express
第2章 HFDS的Shell操作
I'm "fixing movies" in ByteDance
Audio and video development interview questions
README. txt
~69 other ways to use icon fonts