高级JavaScript中最有趣的原型、原型链?

news/2024/7/24 7:40:29 标签: 原型模式, javascript, 前端

封装、继承、多态

基于类 class,JavaScript没有类;JavaScript可以实现面向对象语言特征:封装、继承、多态

封装:通俗的来说就是封装函数,通过私有化的变量和私有化的方法,不让外部访问到 
继承:简约来说可分为两种:
1).通过原型prototype对象实例化实现此类的继承;
2).直接实例化对象复制,完全复制父类对象 
多态: 多态就是通过对传递的参数判断来执行逻辑,即可实现一种多态处理机制

构造函数去继承对象

// 用new去调用,指向内存地址;
//  可以用this新建属性、属性值,为私有属性;
function Preson (x,y,z){
    this.x = x;
    this.y = y;
    this.z = z;
}
let person = new Preson();
new的过程中主要做了如下操作:
// 1、创建一个新对象:
	let obj = new Object()
// 2、将这个新对象的原型链指向构造函数的原型(prototype)属性:
	obj.__proto__ = Object.prototype
// 3、将构造函数的作用域赋给新对象(因此this引用的是新对象):
	let res = Object.call(obj)
//  4、执行构造函数中的代码,并在新对象上设置属性、方法或其他任何初始化逻辑,如果构造函数没有返回 //  其他对象,那么返回新对象 :
	person = typeof (res) === 'object'?res:obj

 原型对象prototype

公有属性,指向同一个内存地址;
可以被所以实例对象访问;
对象优先查找自身私有属性;
每个对象都拥有一个指针(__proto__),固定指向该对象构造函数的原型对象;

定义、修改属性

Object.defineProperty(obj,prop,descriptor):修改或定义一个对象的属性值;返回次=此对象;
    obj:需要定义或修改属性的对象;
    prop:需要修改的属性(字符串型);
    descriptor:描述属性     修改后默认不可修改 (writable : true //可修改)、
                            默认不可枚举 (enumerable:true // 可枚举)、
                            默认不可被删除(configurable : true //可删除);

Object.defineProperty(hello.prototype, 'fn', {
  value: function () {
    console.log(this.name)
  },
  enumerable: false
})

class关键字

// 构造函数的语法糖;本质是函数;
class Student{
    //定义构造函数
    constructor(name,sex,age){             //实例化时立即调用
        //私有属性
        this.name = name;
        this.sex = sex;
        this.age = age;
    }
    //公有函数
    nihao(){
        ...
    }
    //static 静态的、关键字,用来定义静态函数或静态属性;
    static getClassName(){
        ...
    }   //调用与实例无关,用类名访问-Student.getClassName;
}
let s1 = new Student('..','..',..);

// 将class转化为函数
class hello {
  constructor(name) {
    this.name = name
  }
  fn() {
    console.log(this.name)
  }
}

// 转化为以下函数
'use strict' // class内部默认严格模式
function hello(name) {
  // class生成的对象只能通过new调用
  if (!(this instanceof hello) ) {
    throw new TypeError('')
  }
  this.name = name
}

Object.defineProperty(hello.prototype, 'fn', {
 value: function () {
    if (!(this instanceof hello)) {
      throw new TypeError('')
    }
    console.log(this.name)
  },
  enumerable: false   //默认不可枚举
})

基于class继承

// extends:关键字,用于继承父类;
class son extends father{     //继承父类私有属性,super前不允许有任何属性;
     constructor(name){
         super(name);       //函数,调用父类属性;在调用 super()方法之前,子类构造函数无法使用this引用
     }
}


http://www.niftyadmin.cn/n/5314490.html

相关文章

IIS+SDK+VS2010+SP1+SQL server2012全套工具包及安装教程

前言 今天花了两个半小时安装这一整套配置,这个文章的目标是将安装时间缩短到1个小时 正文 安装步骤如下: VS2010 —> service pack 1 —>SQL server2012 —> IIS —> SDK 工具包链接如下: https://pan.baidu.com/s/1WQD-KfiUW…

高光谱分类论文解读分享之基于生成对抗性少数过采样的高光谱图像分类

IEEE TGRS 2022:基于生成对抗性少数过采样的高光谱图像分类 题目 Generative Adversarial Minority Oversampling for Spectral–Spatial Hyperspectral Image Classification 作者 Swalpa Kumar Roy , Student Member, IEEE, Juan M. Haut , Senior Member, IE…

鸿蒙原生应用/元服务开发-长时任务

概述 功能介绍 应用退至后台后,对于在后台需要长时间运行用户可感知的任务,例如播放音乐、导航等。为防止应用进程被挂起,导致对应功能异常,可以申请长时任务,使应用在后台长时间运行。申请长时任务后,系统…

九州金榜|最好的教育资源,就是一流的家庭教育

每个父母都想要为孩子创造最好的条件,报最贵的补习班,安排孩子上最好的学校,哪怕是幼儿园也开始高度重视。 比起这些一流的教育场所,真正成材的,是提供一流的家庭环境。 并不是家庭条件要多么优良,而是和谐…

RabbitMQ解决消息丢失以及重复消费问题

文章目录 1、概念2、基于ACK/NACK机制2.1 基于Spring AMQP框架整合ACK/NACK机制2.2 测试消费失败1.02.3 测试结果1.02.4 测试MQ宕机2.5 测试结果2.0 3、RabbitMQ 如何实现幂等性设计3.1 幂等服务设计思路3.1.1 通过雪花算法生成分布式唯一ID3.1.2 通过枚举类,设计Me…

Openharmony 对应Android基本系统信息

最新需要做Openharmony的一些适配,但是看了hdc,相比adb阉割了不少东西,很多都没展示出来,所以就想方设法跟adb的一些方法对照一下,分享一下希望帮到更多的人。 什么是getprop 在Android系统中,getprop是一个…

SpringMVC-文件上传 拦截器

文件上传和下载 文件下载 1.使用ResponseEntity实现下载文件的功能 需要在 webapp/static/img 下 放一张叫 1.png的图片 RequestMapping("/testDown")public ResponseEntity<byte[]> test(HttpSession session) throws Exception {//获取ServletContext对象…

2024新年烟花代码完整版

文章目录 前言烟花效果展示使用教程查看源码HTML代码CSS代码JavaScript 新年祝福 前言 在这个充满希望和激动的2024年&#xff0c;新的一年即将拉开帷幕&#xff0c;而数字科技的创新与发展也如火如荼。烟花绚丽多彩的绽放&#xff0c;一直以来都是新年庆典中不可或缺的元素。…