记录日期:2019/05/08 21:09
首先看一张图片
图片转自:https://blog.csdn.net/cc18868876837/article/details/81211729
有点懵,没关系。
1、原型 prototype
JS中所有函数都有prototype这个属性,反过来说,拥有prototype属性的对象的本身一定是函数。
2、 原型链
原型链是针对构造函数的,比如我先创建了一个函数,然后通过一个变量new了这个函数,那么这个被new出来的函数就会继承创建出来的那个函数的属性,然后如果我访问new出来的这个函数的某个属性,但是我并没有在这个new出来的函数中定义这个变量,那么它就会往上(向创建出它的函数中)查找,这个查找的过程就叫做原型链。
代码来说明:
function fn1() {
this.a = 1
}
console.log(new fn1().a) // 1 因为查到了a的值
function fn2() {
this.b = 2
}
fn2.prototype = new fn1() // 继承
console.log(new fn2().a) // 1 fn2没有a的值,于是就向上查找,查到继承了fn1的a,则输出1,这个过程查找的过程,叫原型链。
ok,可能你会问,如果fn2中也定义了a怎么办?
看一下代码
function fn1() {
this.a = 1
}
console.log(new fn1().a) // 1 因为查到了a的值
function fn2() {
this.a = 3;
this.b = 2
}
fn2.prototype = new fn1() // 继承
console.log(new fn2().a) // 3 因为fn2中找到了a的值,所以就不会往上查找了,则输出3
ok,可能你又会问,我就要输出刚才继承过来的a 怎么办?
那就强行让他往上查找一层,代码如下:
function fn1() {
this.a = 1
}
console.log(new fn1().a) // 1 因为查到了a的值
function fn2() {
this.a = 3;
this.b = 2
}
fn2.prototype = new fn1() // 继承
console.log(new fn2().a) // 3 因为fn2中找到了a的值,所以就不会往上查找了,则输出3
console.log(new fn2().__proto__.a) // 1 向上查找了一层
ok,这里又有一个知识点,_ proto _ (因为无法显示双下横线,故添加了一个空格)
_ proto _可以理解为一个指针,它指向的是构造它的对象的对象的prototype,听起来有的拗口。举个例子吧!
function fn1() {
this.a = 1
}
console.log(fn1._ _proto_ _ == Function.prototype) // true
为啥? 因为function 等同于new Function, 所以fn1是由 Function构造的,因此fn1._ proto _ == Function.prototype
还不明白?再来个例子
function fn1() {
this.a = 1
}
var s = new fn1()
console.log(s._ _proto_ _ == fn1.prototype) // true
为啥? 还用问吗,因为s是由fn1构造的,所以s._ proto _ == fn1.prototype
3、constructor
可以理解为:constructor指向当前 对象(函数)的构造函数
怎么理解?来个例子:
var fn1 = function () {
this.a = 1
}
var s = new fn1()
console.log(s.constructor == fn1) // true s的构造函数是fn1
console.log(fn1.constructor == Function) // true fn1的构造函数是Function
大概就是这么些,基本是我个人的理解,有的地方用词不太准确,望指正。
网友评论