简单理解JS中的原型链,原型,构造之间的关系

前言

以前觉得原型,原型链,构造就是后端的继承,后来发现这种想法是十分粗陋的,所以这次打算好好梳理下他们三者的关系。

首先我们先名词解释下:

1.原型(对象原型):

# 每个函数都有对象原型(prototype)
let tiger= function (kind, color ) {
  this.kind= kind;  
  this.color = color ;
};
# 实例对象是没prototype的
let oneTiger = new tiger("东北虎",  "白色");
# undefined
oneTiger.prototype;
#函数是有的,{constructor: ƒ}
tiger.prototype
#继承顶级function年龄属性
Function.prototype.age = 26;
# undefined
tiger.age;
#继承顶级对象出生属性
Object.prototype.birth = 1993;
oneTiger.birth;

从上面的可以看出,定义在函数上的属性实例化后就没了;对象则一直存在。这边就涉及到一个难点了,函数属性到底干啥了?

2.构造(constructor):
后端可能一眼就看出来了,这个是类的构造函数,在js里最初没有类,所以这边我们叫他构造器(等于后端的构造函数)。这个构造器专门为function而设计的,这个构造器指向function的引用。

   function Person() {
       
    }
    var p = new Person()
    console.log(Person.prototype); // Object{} 
    console.log(p.prototype); // undifined
    console.log(p.constructor); //function Person(){}    
    此处的p是通过 Person函数构造出来的,所以p的constructor属性指向Person
    console.log(Person.constructor); //function Function(){}
    之前提过,每个函数其实是通过new Function()构造的
    console.log({}.constructor); // function Object(){}
    每个对象都是通过new Object()构造的
    console.log(Object.constructor); // function Function() {}
    Object也是一个函数,它是Function()构造的
    console.log([].constructor);  //function Array(){}

从上面可以看出,对象也是函数创建的!

3.原型链(继承)
实例对象与原型之间的连接(继承),就叫原型链(原型继承)。proto(隐式连接)
proto是个内置属性,指向了它的构造函数原型。这句话什么意思?

# 执行下这个就能发现,
tiger.__proto__ === Object.prototype;

总结

在对象原型上定义属性,构造器指向函数的引用(多用于修正原型指向),最后通过原型链隐式将他们串了起来。简单的将就是可以通过在prototype上定义公共属性给实例函数使用,与后端继承十分相似。

你可能感兴趣的:(简单理解JS中的原型链,原型,构造之间的关系)