👨‍💻
Hong's 前端笔记
  • 🌈About
  • JavaScript
    • 作用域
    • 闭包
    • this
      • bind()
    • 原型
      • Object.create()
      • 模拟“类”
      • ES6 Class
      • Function
    • 对象
    • 类型 & 值
      • 原生函数
      • 数组
      • 字符串
    • 异步
    • JavaScript 相关概念
      • Event Loop 事件循环
      • Prototype 原型
      • Context 执行上下文
      • this
      • Promise
    • JavaScript 常见问题
      • 手写实现
      • 看代码输出
  • React
    • 核心概念
    • 深入理解
      • State
      • 如何管理 State
      • React 渲染过程
      • 处理 DOM 事件
      • Pure 组件
      • Context
      • Key 属性
      • React.lazy()
      • Render Props
    • Hooks
      • useState
      • useRef
      • useEffect
        • Some details
      • 相关概念
      • 自定义 Hook
      • useEffect vs useLayoutEffect
    • React 相关问题
      • Class vs Function
  • React Libraries
    • Redux
      • Quick Start
      • 如何持久化 Redux 数据
      • 异步操作
      • 性能优化
      • Dive into immutability
    • Route v6
      • Quick Start
  • Reactivity
    • Immer
  • Vue
    • 深入理解
      • Composition vs Options
      • Reactivity
  • Network
    • Cookies
    • HTTP
    • HTTPS
    • CORS 跨域资源共享
    • 认证手段
    • 安全相关
    • 网络相关知识
  • Browser
    • DOM 操作
    • Events 事件
    • XHR & Fetch
    • 性能优化
    • HTML 相关概念
    • 浏览器相关概念
  • CSS
    • 盒模型
    • Layout 布局
    • Styles 样式
    • CSS 相关概念
    • CSS 相关技巧
      • 移动端适配
      • Flex
      • 动画
  • TypeScript
    • Quick Peek
    • Types in TypeScript
    • Narrowing
    • Functions in TypeScript
  • Workflow
    • Webpack
      • Webpack 概念
      • 资源管理
      • 管理输出
      • 开发环境配置
      • 生产环境配置
      • 优化代码运行性能
  • Others
    • 小程序与原生 Web 的区别
  • SSO
    • About
    • API Doc
    • 接入指南
Powered by GitBook
On this page
  • 概念
  • 原型链
  • prototype proto
  • 解决原型链污染问题
  • ES5 继承方式
Edit on GitHub
  1. JavaScript
  2. JavaScript 相关概念

Prototype 原型

Last updated 3 years ago

概念

JS 通过原型链来实现继承,而在集成时,不会复制父类属性,还是在子类和父类之间创建一个关联。

原型链

当我们访问一个属性的时候,如果没有,就会顺着 __proto__ 原型链一路向上找。如果找到 Object.prototype 还是没有找到,就返回 undefined

prototype proto

  • 函数都有 prototype

  • 对象都有 __proto__

  • 所用函数都由 Function 创建而来,所以它们的 proto 都是 Function.prototype

  • Function.protype = Function.proto

解决原型链污染问题

我们可以覆盖掉对象原型上的属性,如下:

Object.prototype.toString = function() {
    alert('Hello World')
}

const obj = {}
obj.toString() Object.prototype.toString = function() {    alert('Hello World')}const obj = {}obj.toString()

解决方法

  1. Object.create(null),将对象的原型设置为 null

    const obj = Object.create(null)
  2. Object.freeze(obj),使对象的属性不可修改

ES5 继承方式

原型链继承

将子类的原型指向父类的实例

function SuperType() {
    this.foo = 'bar'
}

function SubType() {}

// 继承
SubType.prototype = new SuperType()

盗用构造函数

子类中使用 call 方法,将 this 绑定到父类上

function SuperType() {
    this.foo = 'bar'
}

function SubType() {
    SuperType.call(this)
}

console.log(new SubType().foo)  // bar

组合继承

原型链 + 盗用

function SuperType() {
    this.foo = 'bar'
}

SuperType.prototype.output = function() {
    console.log(this.foo)
}

function SubType() {
    SuperType.call(this)            // 继承属性
}

SubType.prototype = new SuperType()   // 集成方法

const subType = new SubType()
console.log(subType.foo)            // 访问父级属性 bar
subType.output()                    // 访问父级方法 bar5

寄生组合继承

function SuperType() {
}
function SubType() {
    SuperType.call(this)    // 继承父类属性
}
SubType.prototype = Object.create(SuperType.prototype)	// 取得父类的一个副本
SubType.prototype.constructor = SubType
image-20220406093132498