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

JS原型与原型链总结

程序员文章站 2024-02-01 08:51:34
...

JS原型与原型链总结:

一、专有名词总结

构造函数:

区别:构造函数与其他函数的区别,会new实例化对象,每一个构造函数都有一个原型对象,还有一个原型属性prototype

function Female(name){
    this.name = name;
    this.sex = 'female';  
 }

原型对象:Female就是原型对象

实例化对象:var person1=new Female()     =>person1就是实例化对象

构造函数Female就是实例对象person1的原型!!!Female里的this关键字就指的是person1这个对象!

原型链:

 

 

 二、原型与原型链

1、原型

原型的概念:每一个javascript对象(除null外)创建的时候,就会与之关联另一个对象,这个对象就是我们所说的原型,每一个对象都会从原型中“继承”属性。

  • javascript语言是一种面向对象的语言,它没有"子类"和"父类"的概念,里面所有的数据类型都是对象,如何将这些对象联系起来呢?
  • 构造函数是什么?构造函数与其他函数唯一的区别在于调用方式不同。任何函数只要通过new来调用就可以作为构造函数,它是用来创建特定类型的对象

  • 所以实例对象的属性和方法一般分为两种:一种是自身的,一种是引用自prototype的。

  • 为什么在原型对象上挂属性prototype=>若多个实例调用同一个属性或方法                                                                (希望构造函数中的某个属性是一个共有属性,那么此时用这样的方法,每个实例中都有一个相同的属性,会造成资源极大的浪费)

  •  每当代码读取某个对象的某个属性的时候,都会执行一次搜索。首先从对象实例本身开始,如果在实例中找到了该属性,则返回该属性的值,如果没有找到,则顺着原型链指针向上,到原型对象中去找,如果如果找到就返回该属性值。

    这里要提一点,如果为对象实例添加了一个属性与原型中同名,则该属性会屏蔽掉原型中的同名属性,不会去修改它!使用delete可以删除实例中的属性~(提到delete那要插一句~delete只能删除对象下的属性,不能删除变量和参数!)

2、原型链

一个对象的__proto__指向着他的构造函数的prototype

function Person(name, sex) {
            this.name = name
            this.sex = sex
           
        }
var p1=new Person()

eg:   Person.prototype=p1._proto_

(这个构造函数的__proto__又指向着再上一级的公共区域,而最上级的公共区域实际上也有__proto__,不过可想而知,既然已经是最上级的公共区域,指向的就是null了。)

总结:
实例对象的原型链:
p1._proto_ -> 构造函数.prototype -> Object.prototype -> null

函数的原型链:

函数 -> Function.prototype -> Object.prototype -> null

(由于函数是Function这个构造函数构造出来的,所以函数.__proto__指向的是Function.prototype,再往上?因为Function.prototype也是一个对象,是由Object这个构造函数构造出来的,也就是说Function.prototype.__proto__ === Object.prototype)

JS原型与原型链总结

1、在JavaScript中,每个函数都有一个prototype属性,这个属性指向函数的原型对象。

2、每个原型都有一个constructor属性,指向该关联的构造函数。

3、这是每个对象(除null外)都会有的属性,叫做__proto__,这个属性会指向该对象的原型。(形成原型链)

知乎(完美总结原型与原型链关系):https://zhuanlan.zhihu.com/p/161370971

 

 

 

 

 

 

相关标签: JS高级