MarginLon MarginLon
首页
  • Web

    • Web基础
    • Web布局
    • CodeSnippet
  • Vue

    • Vue
  • React

    • React
  • Node.js

    • Node.js
  • 技术文档
  • UI组件库
  • 动画库
  • 图形库
  • 桌面端
  • 学习笔记
  • 生活笔记
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

MarginLon

http://info.cern.ch
首页
  • Web

    • Web基础
    • Web布局
    • CodeSnippet
  • Vue

    • Vue
  • React

    • React
  • Node.js

    • Node.js
  • 技术文档
  • UI组件库
  • 动画库
  • 图形库
  • 桌面端
  • 学习笔记
  • 生活笔记
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 数据类型 类型检测 类型转换
  • 精度问题
  • 堆栈内存 函数底层运行机制 块级作用域
  • GC机制 闭包作用域 let/const/var
  • 闭包应用
  • DOM
  • BOM
  • This指向
  • 浏览器渲染机制 CRP优化 事件循环机制
  • 函数防抖节流
  • 模块化 柯里化
  • 构造函数 原型
    • 1. 构造函数
    • 2. 原型和原型链
    • 3. 面向对象相关
    • 4. Function和Object
  • CLASS
  • 工厂设计模式 深浅拷贝 深浅合并
  • Iterator/Generator
  • Promise/ Async/ Await
  • HTTP/跨域
  • API
  • AJAX
  • 事件
  • 《JavaScript高级程序设计(第4版)》
MarginLon
2022-04-15
目录

构造函数 原型

  • 1. 构造函数
  • 2. 原型和原型链
  • 3. 面向对象相关
  • 4. Function和Object

# 1. 构造函数

  • JS内置类
    • Number
    • String
    • Boolean
    • Symbol
    • BigInt
    • Object
    • Function
    • ...
    • DOM
      • HTML标签 -> HTMLXXXElement -> HTMLElement -> Element -> Node -> EventTarget -> Object
      • HTMLDocument -> Document -> Node -> ...
      • Window -> WindowProperties -> EventTarget -> Object
      • 元素集合 -> HTMLCollection -> Object
      • 节点集合 -> NodeList -> Object
  • 自定义类(类 <=> 构造函数)
    • 构造函数 VS 普通函数
      1. 产生私有context及后续步骤
      2. 构造函数创建一个空实例对象
      3. 初始this,把this指向当前的实例对象。this.xxx=x是给实例设置私有属性,let xxx=x和实例对象没关系,只是给上下文中设置私有变量
      4. 执行完,return时
        • 没有return/return 基本数据类型值,浏览器默认把创建的实例对象返回
        • return 引用类型,返回自己的返回值。
    • Fn VS Fn():Fn代表函数本身(堆内存),Fn()函数执行,获取返回值。
    • new Fn VS new Fn():执行,第一个不传递实参,第二个传递实参。 优先级 19 VS 20 构造函数和普通函数

# 2. 原型和原型链

  • function内置prototype属性,属性值是一个对象[堆内存],对象中存储属性和方法是供当前类所属实例调用的公共属性和方法
    • 箭头函数和基于ES6给对象某个成员赋值函数值的快捷操作没有prototype
    • Function.prototype是函数
    • 原型对象上有一个内置的属性 constructor(构造器),属性值是当前函数本身
  • object都具备:__proto__,属性值是当前实例所属类的原型prototype
    • Object.protptype的__proto__值是null,Object是所有对象的“基类”
  • 原型链查找机制
    • f1.say
      • 先找私有属性
      • 没有,基于__proto__找所属类原型的公共属性方法
      • 没有,基于原型对象的__proto__查找,直到Object.prototype
    • f1.__proto__.say
      • 跳过私有的,找所属类原型的公有属性方法
      • Fn.prototype.say 基于原型对象查找 原型和原型链 proto constructor prototype proto

# 3. 面向对象相关

  • JS创建值(实例)两种方案:

    • 字面量
    • 构造函数new
    • 对于对象和函数类型,无区别;对于原始值,字面量返回原始值类型,构造函数方式返回对象类型,但都是所属类的实例。
    • Symbol和BigInt 不允许new Object()
    • 装箱: (10).toFixed(2) 原始值变为对象类型实例再操作
    • 拆箱: let n = new Number(10); n+10;
  • 检测一个属性是否为当前对象的成员

    • 属性名 in 对象:无论公私有,有就是true
    • 对象.hasOwnProperty(属性名):只有私有true
  • 验证实例属于类 instanceof

    • 1 instanceof Number // => false
  • 检测公有属性

    function hasPubProperty(obj,attr){
      
    // 弊端:既私有又公有
    // return (attr in obj) && !obj.hasOwnProperty(attr);
    
    // 跳过私有,直接公有
    let proto = Object.getPrototypeof(this);
    while(proto){
      if(proto.hasOwnProperty(attr)) return true;
      proto = Object.getPrototypeOf(proto);
    }
    if(!proto) return false;
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
  • 基于"for key in obj"循环遍历

    • 优先遍历数字属性
    • 不会遍历到Symbol
    • 会把自己扩展到“类原型”上的公共属性方法也遍历 [可枚举的] if(!obj.hasOwnProperty(key)) break;//遍历到公共属性,停止遍历
    • Object.keys(obj):非Symbol私有属性 [数组]
    • Object.getOwnPropertyNames(obj): 同上
    • Object.getOwnPropertySymbols(obj):Symbol私有属性 [数组]
    let keys = [...Object.keys(obj),...Object.getOwnPropertySymbols(obj)];
    keys.forEach(key=> {
                console.log(`属性名:$(),属性值:$()`);.
    });
    
    1
    2
    3
    4

# 4. Function和Object

Function和Object

编辑 (opens new window)
上次更新: 2023/04/01, 15:26:22
模块化 柯里化
CLASS

← 模块化 柯里化 CLASS→

最近更新
01
KnockoutJS
11-12
02
综述
10-17
03
前言
10-12
更多文章>
Theme by Vdoing | Copyright © 2019-2024 MarginLon | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式