JavaScript中的行为委托和面向类的区别?

先复习一些原型链的知识:
[[Prototype]] 机制是一种存在于一个对象上的内部链接它指向一个其他对象
在JavaScript中,每个对象都有一个原型对象(prototype),当访问对象的属性或方法时,如果对象自身没有定义,它会沿着原型链向上查找直到找到对应的属性或方法。这种原型链的机制使得对象之间可以实现继承关系,从而可以共享原型对象上的属性和方法。

1. 行为委托

首先定义一个称为 Parent 的对象 (不是一个类,也不是function),让它拥有具体的行为。定义一个 对象来持有这个特定任务的数据 /行为。

const A = {setName:function(name){this.name = name},getName: function () {return 'my name is ' + this.name;},
}
// 使 B 委托到 A, B的[[protoType]]会指向A对象
const B = Object.create(A);//Object.create作用:以一个现有对象为原型创建一个新对象
B.greeting = function(){console.log('hello, '+this.getName());
}//使 b1 委托到 B, b1的[[protoType]]会指向B对象
const b1 = Object.create(B);
// 通过原型链访问A对象上方法
b1.setName('b1');
//使 b2 委托到 B, b2的[[protoType]]会指向B对象
const b2 = Object.create(B);
b2.setName('b2');// 通过原型链访问B对象上方法
b1.greeting()// hello, my name is b1
b2.greeting()// hello, my name is b2

行为委托意味着:在访问某个对象上不存在的属性或方法时,让这个对象为属性或方法引用提供一个委托。可以多级委托,但是不能相互委托,不能在两个或多个对象间相互地委托(双向地)对方来创建一个 循环 。比如使 B 链接到 A,然后试着让 A 链接到 B。

注意:要尽量避免在 [[Prototype]] 链的不同层级上有相同的命名,因为会出现遮蔽现象。

2. 原型连中的遮蔽

const oldObj = {a: 2
};// newObj的[[protoType]]会指向 oldObj
const newObj = Object.create( oldObj );console.log(oldObj.a);//2
console.log(newObj.a);//2 (查找原型链上的属性)console.log(oldObj.hasOwnProperty( "a" ));// true
console.log(newObj.hasOwnProperty( "a" ));// false
newObj.a++;
console.log(oldObj.a);//2
console.log(newObj.a);//3 console.log(oldObj.hasOwnProperty( "a" ));// true
console.log(newObj.hasOwnProperty( "a" ));// true (是自己的属性噢!竟然创建了一个新属性!!)

虽然看起来 newObj.a++ 应当(通过委托)查询并原地递增 oldObj.a 属性,但是 ++ 操作符相当于 newObj.a = newObj.a + 1。
newObj.a + 1 是在[[Prototype]] 上进行 a 的 [[Get]]查询,从 oldObj.a 得到当前的值 2,将这个值递增1。然后将这个值 3 用 [[Put]]赋值给 newObj 上的新遮蔽属性 a上。
如果想递增 oldObj.a,唯一正确的方法是 oldObj.a++

3. 面向类

实现与行为委托例子一样的行为:

function A(name){this.name = name
}
A.prototype.getName = function (){return 'my name is ' + this.name
}
function B(name){// this的显式绑定:this指向A,并调用A函数初始化nameA.call(this,name)
}
// B继承A
// 将A.prototype对象作为B的原型对象,B.prototype继承了A.prototype的属性和方法
B.prototype = Object.create(A.prototype);
B.prototype.greeting = function(){console.log('hello, '+this.getName());
}
// 调用 B函数,创建一个新对象b1,并将this指向b1
const b1 = new B('b1');
const b2 = new B('b2');b1.greeting();// hello, my name is b1
b2.greeting();// hello, my name is b2

在 JS 中,构造器 仅仅是一个函数,它们偶然地与前置的 new 操作符一起调用。它们不依附于类,它们也不初始化一个类。它们甚至不是一种特殊的函数类型。它们本质上只是一般的函数,在被使用 new 来调用时改变做了附加的行为。(创建一个新对象,并将this指向这个新对象)

4. 行为委托和面向类的区别

  1. 对象关系:
  • 行为委托: 在行为委托中,对象之间是对等的,它们彼此通过委托来共享和重用代码。对象之间的关系是动态的,一个对象可以将请求委托给另一个对象来处理,而不是通过类和继承来建立父子关系。
  • 面向类: 在基于类的继承中,通常存在明确的父类和子类之间的关系。子类继承父类的属性和方法,并且可以添加或修改这些属性和方法。对象之间的关系是静态的,由类定义决定,在对象创建时就确定了
  1. 代码组织方式:
  • 行为委托: 在行为委托中,代码的组织方式更加灵活,因为对象之间的关系是动态的。对象通过委托来共享和重用代码,使得代码更具可组合性和灵活性。
  • 面向类: 在基于类的继承中,代码通常是通过类来组织的,对象之间的关系由类的层次结构确定。虽然类继承提供了一种组织和复用代码的方式,但它也可能导致类层次结构的复杂性和深层次的继承链
  1. 继承机制:
  • 行为委托: 在行为委托中,对象之间通过委托共享和重用代码,而不是通过继承。
  • 面向类: 在基于类的继承中,子类继承父类的属性和方法,并且可以通过继承来共享和重用代码。继承是通过类和类之间的关系来实现的,子类可以扩展或修改父类的行为。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/774477.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【SpringSecurity】基础入门

目录 权限管理什么是权限管理认证授权权限管理解决方案Shiro开发者自定义Spring Security Spring Security特性Spring、Spring Boot 和 Spring Security 三者的关系整体架构1.认证AuthenticationManagerAuthenticationSecurityContextHolder 2.授权AccessDecisionManagerAccess…

作为数据分析师,如何能把AI工具和数据分析工作更好的结合?

在当今信息爆炸的时代,数据已经成为企业、研究机构乃至个人决策的重要依据。然而,如何高效地处理、分析和解读这些数据,从而提炼出有价值的信息,却成为了一个亟待解决的问题。 幸运的是,随着人工智能技术的飞速发展&a…

刷好题,固基础-2

7-5 运动会 T公司的员工层级关系可以表示成一棵树,员工X是员工Y的直接领导,则在树中X是Y的父结点。公司拟组织一场运动会,但为了避免尴尬,每个员工都不想与自己的直接领导一起参赛。假定每个员工都对应一个权重(领导的…

二叉树|450.删除二叉搜索树中的节点

力扣题目链接 class Solution { public:TreeNode* deleteNode(TreeNode* root, int key) {if (root nullptr) return root; // 第一种情况:没找到删除的节点,遍历到空节点直接返回了if (root->val key) {// 第二种情况:左右孩子都为空&…

使用AI 编写一个Mybatis SQL日志解析工具

使用AI 编写一个Mybatis SQL日志解析工具 背景 尝试使用智谱清言 AI 编写一个工具,将Mybatis SQL日志解析为可以执行的SQL语句。 操作 准备初始代码 首先网站上找了一个有BUG的简单的实现 https://blog.csdn.net/x541211190/article/details/107410409 用提示…

【WEEK4】 【DAY5】AJAX第二部分【中文版】

2024.3.22 Friday 接上文【WEEK4】 【DAY4】AJAX第一部分【中文版】 目录 8.4.Ajax异步加载数据8.4.1.新建User.java8.4.2.在pom.xml中添加lombok、jackson支持8.4.3.更改tomcat设置8.4.4.修改AjaxController.java8.4.5.新建test2.jsp8.4.5.1.注意:和WEB-INF平级&…

.NET Core教程:入门与实践实例

.NET Core教程:入门与实践实例 在信息技术飞速发展的今天,掌握一门高效的编程技术成为了每个开发者不可或缺的技能。在众多编程框架中,.NET Core以其跨平台、高性能和易扩展的特性,受到了广大开发者的青睐。本文将通过实例&#…

一文解析:固定电感器结构、作用及其与扼流圈和可变电感器的差异

固定电感器是一种电子元件又称固定线圈,用于在电路中产生固定的电感值。电感是指导致电流变化时产生电动势的能力,通常用亨利(Henry)作为单位。固定电感器的电感值是预先确定的,通常以特定的数值标识,例如1…

免疫荧光染色

每次要将手/样品伸进细胞培养箱,生物培养平台D 中时,都要喷洒酒精消毒。 以两个样品/两个培养基为例 从细胞培养箱(37度,5%CO2浓度)取出要染色的细胞;放在显微镜下观察,观察细胞是否趴壁以及细…

【正点原子FreeRTOS学习笔记】————(10)FreeRTOS时间管理

这里写目录标题 一、延时函数介绍(了解)二、延时函数解析(熟悉)三、延时函数演示实验(掌握) 一、延时函数介绍(了解) 相对延时:指每次延时都是从执行函数vTaskDelay()开始…

onnxruntime 中的 Gather 算子

上一篇文章中介绍了 Division by Invariant Integers using Multiplication 的原理,很多框架均才用该算法优化除法运算。onnxruntime 是已知实现中最为简洁的,因此本文结合 onnxruntime 的 Gather 实现进行介绍。 Gather 算子是一个索引类算子&#xff0…

Python(django)之单一接口展示功能前端开发

1、代码 建立apis_manage.html 代码如下&#xff1a; <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>测试平台</title> </head> <body role"document"> <nav c…

S7-200 SMART 选型指南及详细技术参数

S7-200 SMART 选型指南 选型指南 硬件能力 功能 CPU外形结构与电源需求计算 直流安装 交流安装 电源需求与计算 S7-200 SMART CPU模块提供5VDC和24VDC电源&#xff1a; CPU有一个内部电源&#xff0c;用于为CPU、扩展模块、信号板提供电源和满足其他24 VDC用户电源需求。请使…

数据结构二叉树计算公式

这些是关于二叉树、完全二叉树、B-树以及树的深度和高度的一些基本概念和重要性质。让我们一一解读这些性质: 二叉树的计数公式:给定 n 个节点,可以构造的不同二叉树数量是 (\frac{(2n)!}{n! \cdot (n+1)!})。这是一个来自组合数学的结果,称为 Catalan 数。这个公式非常重要…

鸿蒙HarmonyOS应用开发之使用Node-API接口进行线程安全开发

场景介绍 napi_create_threadsafe_function是Node-API接口之一&#xff0c;用于创建一个线程安全的JavaScript函数。主要用于在多个线程之间共享和调用&#xff0c;而不会出现竞争条件或死锁。例如以下场景&#xff1a; 异步计算&#xff1a;如果需要进行耗时的计算或IO操作&a…

Scala介绍与环境搭建

Scala环境搭建与介绍 一、Scala环境搭建 1、环境准备与下载 2、验证Scala 3、IDEA新建项目&#xff0c;配置Scala&#xff0c;运行Hello world 二、Scala介绍 1、Scala 简介 2、Scala 概述 一、Scala环境搭建 1、环境准备与下载 JDK1.8 Java Downloads | Oracle 下载需求版本…

如何将python项目转变成deb安装包

先将python项目转变成可执行文件 1. 首先确保你的python项目可以正常执行 2.安装pyinstaller模块&#xff0c;pip install pyinstaller -i Simple Index 3.确定好你的项目的文件入口&#xff0c;也就是运行的文件.py 4. 开始打包成单文件&#xff0c;pyinstaller -F <第…

美团春招内幕揭秘:2024最全面Spring CORS面试题解析,跨域问题大师级指南!

随着现代Web应用越来越多地采用前后端分离的架构&#xff0c;跨域资源共享&#xff08;CORS&#xff09;成为了Web开发中不可或缺的一部分。对于构建复杂、响应迅速的Web应用&#xff0c;了解并正确实施CORS策略是确保应用安全、高效运行的关键。美团&#xff0c;作为中国领先的…

STM32学习笔记(6_7)- TIM定时器的编码器接口原理

无人问津也好&#xff0c;技不如人也罢&#xff0c;都应静下心来&#xff0c;去做该做的事。 最近在学STM32&#xff0c;所以也开贴记录一下主要内容&#xff0c;省的过目即忘。视频教程为江科大&#xff08;改名江协科技&#xff09;&#xff0c;网站jiangxiekeji.com 现在开…

【Java程序设计】【C00374】基于(JavaWeb)Springboot的社区疫情管理系统(有论文)

TOC 博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;已经做了六年的毕业设计程序开发&#xff0c;开发过上千套毕业设计程序&#xff0c;博客中有上百套程序可供参考&#xff0c;欢迎共同交流学习。 项目简介 项目获取 &#x1f345;文末点击卡片…