欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JavaScript原型链详解

程序员文章站 2022-03-19 13:06:32
目录1、构造函数和实例2、属性prototype3、属性__proto__4、访问原型上的方法5、构造函数也有__proto__6、构造函数的原型也有__proto__7、object.prototy...

1、构造函数和实例

假设你声明一个方法叫做foo() ,那么我们可以通过new foo()来声明实例。

    function foo() {
      console.log("我是一个构造方法");
    }
    const f1 = new foo();

现在你可以很清晰的明白foo()是构造函数,f1是它的实例。

2、属性prototype

foo()这个构造函数是一个方法。

方法也是对象数据类型,所以可以说方法是个对象。

对象就有属性,不过方法有自己特殊的一个属性,叫做prototype,其他对象没有哦。

这个属性会指向一个原型对象(foo.prototype),而原型对象也会有一个自己的属性叫做constructor,指向属性包含了一个指针,指回原构造函数。

 

   function foo() {
      console.log("我是一个构造方法");
    }
    const f1 = new foo();

    console.log(foo.prototype);//foo的原型对象
    console.log(f1.prototype);//f1没有 underfied


JavaScript原型链详解

3、属性__proto__

上文的prototype是给构造函数的所有实例提供共享方法和属性的。

实例又是怎么访问到共享方法和属性的呢?

f1实例没有prototype,而有一个属性__proto__,这是所有对象都有的属性,它指向到构造自己的构造函数的原型对象,然后js这个语言就是根据这个属性来让实例访问到共享属性和方法的

foo是f1的构造函数,foo.prototypefoo的原型对象,所以f1.__proto__指向foo.prototype

    function foo() {
      console.log("我是一个构造方法");
    }

    const f1 = new foo();

    console.log(foo.prototype);
    console.log(f1.__proto__);


JavaScript原型链详解

4、访问原型上的方法

foo这个构造函数如果希望自己的实例能够拥有同一个属性,比如name,就在自己的原型对象上加上。

 

   function foo() {
      console.log("我是一个方法");
    }

    foo.prototype.name = "我是foo创造的实例共享的属性";

    const f1 = new foo();
    const f2 = new foo();

    console.log(f1.name);//我是foo创造的实例共享的属性
    console.log(f2.name);//我是foo创造的实例共享的属性


JavaScript原型链详解

5、构造函数也有__proto__

上面说所有对象都有__proto__ ,foo是函数也是对象啊,所以foo.__proto__是啥呢?

那就去找foo的构造函数是谁呢,foo是一个函数,拥有函数特有的方法和属性,创造的它的构造函数就是function,这个js自带的的一个构造函数,它的function.prototype给所有js中你创建的函数提供函数自带的一些公共方法和属性。

所以foo.__proto__指向funtion.prototype

6、构造函数的原型也有__proto__

foo.prototype也是对象,所以它也有__proto__。

每当我们要找__proto__,就得找它的构造函数,foo.prototype是个对象,纯对象,所以它的构造函数是object,那么object的原型就是object.prototype。

foo.prototype.__proto__指向object.prototype

7、object.prototype这个原型对象很特殊

arraystringfuntionobject这些构造函数都是函数,
都是funtion构造函数的实例,
array.__proto__string.__proto__funtion.__proto__ object.__proto__指向funtion.prototype原型,
可以调用funtion.prototype原型的一些公共方法,
例如都可以调用.name查看自己的函数名字。

array.prototypestring.prototypefuntion.prototype这些原型对象都是对象,
都是object构造函数的实例,
array.prototype.__proto__ string.prototype.__proto__funtion.prototype.__proto__指向object.prototype原型,
所以可以调用object.prototype这个原型对象的公共方法,

object.prototype有些特殊,它虽然是对象,但是并不是object自己的实例,
object.prototype.__proto__指向null,作为原型链的终点

8、总结

方法,也就是函数,才有prototype,就是方法的原型。
所以实例,一般都会有个对应的构造方法,也就是构造函数,实例的__proto__指向构造方法的原型。
js有很多自带的构造方法,例如arraystringfuntionobject,都是根据js一些对象类型分配的,他们的原型上提供了许多封装好的常用方法。
所有构造方法本身是函数,是funtion这个js自带构造函数的实例。
除了object.prototype,所有构造方法的原型本身是对象,是object这个js自带构造函数的实例。
object.prototype.__prototype指向null,作为原型链终点。

JavaScript原型链详解

到此这篇关于javascript原型链详解的文章就介绍到这了,更多相关javascript原型链内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!