最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

js原型使用详解

来源:动视网 责编:小采 时间:2020-11-27 19:47:12
文档

js原型使用详解

js原型使用详解:这次给大家带来js原型使用详解,js原型使用的注意事项有哪些,下面就是实战案例,一起来看一下。什么是原型?在 javascript 中原形是一个对象,通过原形可以实现属性的继承。 let personBase = new Object() personBase.gender = 
推荐度:
导读js原型使用详解:这次给大家带来js原型使用详解,js原型使用的注意事项有哪些,下面就是实战案例,一起来看一下。什么是原型?在 javascript 中原形是一个对象,通过原形可以实现属性的继承。 let personBase = new Object() personBase.gender = 


构造函数、实例、原型之间的关系

弄明白这三者之间的关系关键是理解 prototypeprotoconstructor 之间的的联系:

属性-
prototype函数属性,指向原型
proto实例属性,指向原型
constructor原型属性,指向构造函数

在JavaScript中,每个函数都有一个prototype属性,当一个函数被用作构造函数来创建实例时,该函数的prototype属性值将被作为原型赋值给所有对象实例(设置实例的proto属性),也就是说,所有实例的原型引用的是构造函数的prototype属性。同时在原型对象中,包含一个"constructor"属性,这个属性对应创建所有指向该原型的实例的构造函数(有点拗口,就是constructor属性指向构造函数)。这三者的关系可以用下面的示例图表示:

所以构造函数通过 prototype 属性指向自己的原型。 构造函数的实例在创建后通过 proto 属性指向构造函数的 prototype 的对象,即实例函数也指向原型。构造函数和实例都通过属性指向了原形。

代码示例:

 function Person () {}
 let manPerson = new Person()
 manPerson.proto === Person.prototype // true
 Person.prototype.constructor === Person // true
 manPerson.constructor === Person.prototype.constructor // true
  • manPerson是构造函数Person的实例

  • manPersonproto属性与Personprototype属性保存的值相等,即他们指向同一个对象原形

  • Person 的原形(Person.prototype)通过constructor属性指向 构造函数 Person ,即 Person和他的原形实现了相互引用

  • 实例的constructor属性与原形的constructor属性相等。这里实例的constructor属性是继承自原形的constructor属性。

  • 反过来原型和构造函数是没有指向实例的引用,因为一个构造函数会有N个实例。javascript通过实例的 proto 属性来访问共同的原形。

    所有函数都是 Function 构造函数的实例,而且函数也是一个对象
    同时函数实例的字面量方式创建 function too(){} 等同于构造函数方式创建 let foo = new Function()
     foo instanceof Function // true
     too instanceof Function // true
     foo.proto === too.proto // true
     foo.proto === Function.prototype // true foo是Function的实例

    所以too、foo都是Function的实例,他们的_proto指向的是Function构造函数的原型。

    通过上面的示例代码分析,这里主要涉及到 prototypeprotoconstructor 这3个属性的关系。

    我们再次梳理一下:

  • 对于所有的对象,都有proto属性,这个属性对应该对象的原型

  • 对于函数对象,除了proto属性之外,还有prototype属性,当一个函数被用作构造函数来创建实例时,该函数的prototype属性值将被作为原型赋值给所有对象实例(也就是设置实例的proto属性)

  • 所有的原型对象都有constructor属性,该属性对应创建所有指向该原型的实例的构造函数

  • 函数对象和原型对象通过prototypeconstructor属性进行相互关联

  • 所以上面的关系图其实可以于理解为:


    题外话:

     Function.prototype === Function.proto

    先有鸡还是先有蛋?怎么 Function 作为构造函数 与 Function 作为实例对象的原型相等

    在JavaScript中,Function构造函数本身也算是Function类型的实例吗?Function构造函数的prototype属性和proto属性都指向同一个原型,是否可以说Function对象是由Function构造函数创建的一个实例?
    相关问题
    JavaScript 里 Function 也算一种基本类型?
    在JavaScript中,Function构造函数本身也算是Function类型的实例吗?

    对于这类问题也可以不用深究。


    constructor

    原型的constructor属性指向对应的构造函数

     function Person() {
     }
     console.log(Person === Person.prototype.constructor); // true

    原型链

    当理解了原形的概念后,原形链就比较好理解了。

    因为每个对象和原型都有原型,对象的原型指向对象的父,而父的原型又指向父的父,这种原型层层连接起来的就构成了原型链。.JavaScript 对象通过proto指向原型对象的链。原形链的概念不难理解,当访问一个对象的属性时,它不仅仅在该对象上搜寻,还会搜寻该对象的原型,以及该对象的原型的原型,依次层层向上搜索,直到找到一个名字匹配的属性或到达原型链的末尾,找到就返回该属性的值否则就返回undefind(原形链的末端是 null)。

    关于 javascript 中各数据类型原形之间的关系可以参考下图理解:

    相信看了本文案例你已经掌握了方法,更多精彩请关注Gxl网其它相关文章!

    推荐阅读:

    React-router v4使用步骤详解

    nodejs express配置自签名https服务器步骤详解

    文档

    js原型使用详解

    js原型使用详解:这次给大家带来js原型使用详解,js原型使用的注意事项有哪些,下面就是实战案例,一起来看一下。什么是原型?在 javascript 中原形是一个对象,通过原形可以实现属性的继承。 let personBase = new Object() personBase.gender = 
    推荐度:
    标签: 使用 用法 讲解
    • 热门焦点

    最新推荐

    猜你喜欢

    热门推荐

    专题
    Top