美文网首页
JS的原型链

JS的原型链

作者: amenema | 来源:发表于2019-06-05 11:58 被阅读0次

JS的原型链

本文阐述了js中的prototype,constructorproto之间的关系。
同时梳理了js如何实现继承的。

属性释义

  • prototype
    prototypeJS中除了通过bind()生成的函数外所有function都具有的属性,其值为一个对象,对象里包含两个
    值(protoconstructor)。作用是存储要共享的属性和方法。
  • _proto_([[Prototype]])
    protoJS中每个对象都有的属性,其值指向了该对象构造函数的prototype
  • constructor
    constructor即构造函数,构造函数就是构造函数,其值为函数本身。

实例属性与类属性

  • 类属性是指绑定到prototype上的属性,可以被所有通过该构造函数创建的实例继承。
  • 实例属性是指绑定到this上的属性,可通过在构造函数内给对象init时绑定或者直接在
    生成对象后绑定。其值是不可共享的。

属性之间的关系

1.jpg
//定义一个构造函数 
var Foo = function(){}

此时[1] Foo.prototype = {constructor: Foo, __proto__:Object.prototype}
即:Foo.prototype.__proto__ === Object.prototype,
因为 Foo.prototype的值是个Object实例,
所以[3] {}.__proto__ = Object.prototype

console.log(Foo.prototype.__proto__ === Object.prototype
console.log(Foo.prototype.constructor === Foo)
var f1 = new Foo()
//此时[2] f1.__proto__ === Foo.prototype
console.log(f1.__proto__ === Foo.prototype)

Foo是我们自定义的构造函数,JS内置的构造函数也是同样的如Object,这里的Object是个构造函数
Object.prototype = {constructor: Object, __proto__: null}

console.log(Object.prototype.__proto__)
//null

为什么[4] Object.prototype.__proto__会是null呢?
Object.prototype 不是为 {} 吗, {}.__proto__不应该
Object.prototype吗?而且我们自定义的构造函数就是这个样子呀!

如果设置Object.prototype.__proto__ = Object.prototype 那么,当查找一个不存在的属性时,JS
会从上级原型链去查这个属性,便会出现死循环,所以ES5规定Object.prototype.__proto__ = null
而且Object.prototype 指向的对象并不是继承自Object,即它不是Object的实例。

原文:15.2.4

The value of the [[Prototype]] internal property of the Object prototype object is null, the value of the [[Class]] internal property is "Object", and the initial value of the [[Extensible]] internal property is true.

上面提到JS内置的构造函数Object,在JS中函数也是一种对象,即也存在Object.__proto__ 那么它指向谁呢?当然是Function.prototype了,因为
Functionjs中所有function的构造函数,所以function Object(){}Function的一个实例。
所以[7] Object.__proto__ === Function.prototype

console.log(Object.__proto__ === Function.prototype)
//true

JSFunction也是一个构造函数。
所以[9] Function.prototype = {constructor: Function, __proto__: Object.prototype}
[10] Function.__proto__ = Function.prototype

至此便是一个完整的JS原型链。

相关文章

  • 廖雪峰JS小记

    (function(){})() 原型,原型链 浅谈Js原型的理解JS 原型与原型链终极详解 对象 对象:一种无序...

  • JS的__proto__和prototype

    最近在回顾JS的原型和原型链的知识,熟悉JS的同学都知道JS的继承是靠原型链实现的,那跟原型链相关的属性__pro...

  • Javascript(三)之原型继承理解

    进阶路线 3 原型继承 3.1 优秀文章 最详尽的 JS 原型与原型链终极详解 一 最详尽的 JS 原型与原型链终...

  • 从实现角度分析js原型链

    从实现角度分析js原型链 欢迎来我的博客阅读:《从实现角度分析js原型链》 网上介绍原型链的优质文章已经有很多了,...

  • JS原型链

    1什么是JS原型链? 通过__proto__属性将对象与原型对象进行连接. 1.1 JS原型链的作用? 组成的一个...

  • 关于JS中的原型和原型链

    目录 关于js 对象和原型 原型链 基于原型链的继承 参考资料ECMAScript 6 入门JavaScript原...

  • js_继承及原型链等(四)

    js_继承及原型链等(三) 1. 继承 依赖于原型链来完成的继承 发生在对象与对象之间 原型链,如下: ==原型链...

  • JavaScript原型链

    js原型链 原型链是JS面向对象的基础非常重要 所有对象只有__proto__属性,而函数具有prototype属...

  • 2022前端高频面试题

    JS相关 1.原型和原型链是什么 原型和原型链都是来源于对象而服务于对象的概念js中引用类型都是对象,对象就是属性...

  • 再来看一次JS继承

    原型链继承 理解原型链的概念 用一张图来理解原型链再合适不过了。 总结概括JS红宝书上对原型链的概念:每个函数都有...

网友评论

      本文标题:JS的原型链

      本文链接:https://www.haomeiwen.com/subject/ffvjxctx.html