首页 > 编程语言 >面向对象编程 -- 创建对象1

面向对象编程 -- 创建对象1

时间:2023-04-13 16:45:43浏览次数:37  
标签:console name -- 创建对象 sayName Person job 面向对象编程 log

面向对象编程 -- 创建对象1

// 虽然使用 Object 构造函数或对象字面量可以方便地创建对象,但这些方式也有明显不足:创建具有同样接口的多个对象需要编写很多代码。

一、概述

// 纵观 ECMAScript 规范的历次发布,每个版本的特性似乎都出人意料。

// ECMAScript 6 开始正式支持类和继承。

二、工厂模式

// 工厂模式是一种众所周知的设计模式,广泛应用于软件工程领域,用于抽象创建特定对象的过程。

function createPerson(name, age, job) {
  let o = new Object();
  o.name = name;
  o.age = age;
  o.job = job;
  o.sayName = function() {
    console.log(this.name);
  };  
  return o;
}
           
let person1 = createPerson("Nicholas", 29, "Software Engineer");
let person2 = createPerson("Greg", 27, "Doctor");

工厂模式 01.png

三、构造函数模式

// ECMAScript 中的构造函数是用于创建特定类型对象的。

// 前面的例子使用构造函数模式可以这样写:

function Person(name, age, job){
  this.name = name;
  this.age = age;
  this.job = job;
  this.sayName = function() {
    console.log(this.name);
  };  
}
           
let person1 = new Person("Nicholas", 29, "Software Engineer");
let person2 = new Person("Greg", 27, "Doctor");

person1.sayName();  // Nicholas
person2.sayName();  // Greg

构造函数模式02.png

// person1 和 person2 分别保存着 Person 的不同实例。

console.log(person1.constructor == Person);  // true
console.log(person2.constructor == Person);  // true

// 前面例子中的每个对象都是 Object 的实例,同样也是 Person 的实例。

console.log(person1 instanceof Object);  // true
console.log(person1 instanceof Person);  // true
console.log(person2 instanceof Object);  // true
console.log(person2 instanceof Person);  // true

1.构造函数也是函数

// 构造函数与普通函数唯一的区别就是调用方式不同。


// 用作构造函数
let person = new Person("Nicholas", 29, "Software Engineer");
person.sayName();   // "Nicholas"
           
// 作为函数调用
Person("Greg", 27, "Doctor");  // adds to window
window.sayName();   // "Greg"
           
// 在另一个对象的作用域中调用
let o = new Object();
Person.call(o, "Kristen", 25, "Nurse");
o.sayName();  // "Kristen" 

构造函数也是函数 03.png

2.构造函数的问题

// 构造函数虽然有用,但也不是没有问题。

// 每次定义函数时,都会初始化一个对象。

function Person(name, age, job){
  this.name = name;
  this.age = age;
  this.job = job;
  this.sayName = new Function("console.log(this.name)");  // 逻辑等价
}


// 不同实例上的函数虽然同名却不相等。

console.log(person1.sayName == person2.sayName);  // false

// 要解决这个问题,可以把函数定义转移到构造函数外部

function Person(name, age, job){
  this.name = name;
  this.age = age;
  this.job = job;
  this.sayName = sayName;
}
           
function sayName() {
  console.log(this.name);
}
           
let person1 = new Person("Nicholas", 29, "Software Engineer");
let person2 = new Person("Greg", 27, "Doctor");

person1.sayName();  // Nicholas
person2.sayName();  // Greg 
console.log(person1.sayName == person2.sayName); 

构造函数的问题 04.png

标签:console,name,--,创建对象,sayName,Person,job,面向对象编程,log
From: https://blog.51cto.com/u_14483476/6188126

相关文章

  • es 同步索引报错:ElasticSearch ClusterBlockException[blocked by: [FORBIDDEN/12/ind
    es同步索引报错:ElasticSearchClusterBlockException[blockedby:[FORBIDDEN/12/indexread-only/allowdelete(api)]原因:网上有的解决方式是方法一,我试过,没有生效使用的是方法二方法一curl-XPUT-H"Content-Type:application/json"https://localhost:9200/_all/_set......
  • Java常用实体类介绍:POJO、Domain、DO、DTO、VO
    POJOPOJO是PlainOldJavaObject的简称,它指的是一个没有限制或要求下的纯平对象。POJO用于表示没有任何框架或技术限制的纯数据对象。在Java开发中,POJO通常用于简化复杂对象和降低对象的耦合度,是面向对象编程中"高内聚、低耦合"设计思想的体现。示例代码:@Datapublic......
  • DispatcherServlet 是一个 Servlet 也是一个bean
    ServletDispatcherServlet实现了javax.servlet.Servlet接口,负责处理来自客户端浏览器的HTTP请求,并将请求分发给相应的Controller进行处理。DispatcherServlet通常是Web应用程序中唯一一个Servlet,并且是SpringMVC框架中最核心的组件之一。SpringBoot启动时会初始化Tomcat容器......
  • 跟着查老四学Python Day 11:常用 Python 库
    Python库概览例行寒暄之后,查老四就开始授课了老猫:请大致介绍一下Python库查老四:Python库是一组预先编写好的模块或函数,它们可以实现特定功能或解决特定问题。Python有许多库,它们覆盖了各种不同的领域和应用。以下是一些常用Python库的简要介绍:NumPy:一个用于处理数组和矩阵运算的......
  • 服务器通用背板管理(UBM)实现
    本文分享自天翼云开发者社区《服务器通用背板管理(UBM)实现》,作者:乘风  一UBM概述通过SGPIO进行SAS和SATA背板管理的SCSI机箱服务(SES)标准于2003年首次推出。该规范提供主机控制LED,并允许主机检测槽位和已安装驱动器的存在,以及槽位编号方案。该规范提供了驱......
  • 详解GaussDB(DWS)的query_band负载识别与应用
    摘要:query_band是一个会话级别(session)的GUC参数,本身是字符串类型,支持任意形式字符组合。本文分享自华为云社区《GaussDB(DWS)的query_band负载识别与应用》,作者:门前一棵葡萄树。query_band概述GaussDB(DWS)实现了基于query_band的负载识别和优先级调度,一方面提供了更为灵活......
  • 链路聚合
    ● 链路聚合● 活动接口:可以转发数据的接口● 活动链路:活动接口组成的链路● 链路聚合模式● 手工负载分担模式下所有活动接口都参与数据的转发,分担负载流量● LACP模式支持链路备份● 数据流控制● Eth-Trunk链路两段相连的物理接口的数量、速率、双工方式、流控方式必须......
  • Elasticsearch——》kibana操作索引:增删改查
    一、新建索引PUT/test_001{"settings":{"index":{"max_result_window":1000000},"analysis":{"analyzer":{"ik_max_word":{"tokenizer":"ik_max_......
  • ubuntu 20.04 基于docker快速搭建中文 的一些问题解决 Utilization of discoverer pro
    1.Utilizationofdiscovererprocessesover75%解决办法问题状态如下zabbixserver在开启Discovery功能后,zabbixweb页面报警提示:“Zabbixserver:Ulitizationofdiscovererprocessesover75%”。原因:每个discovery任务占用一个discovery进程,但是zabbixserver默认只配置了一......
  • Vue样式组件库
    常用样式库常用的Vue样式库如下组件库说明地址element目前只支持到vue2.x版本,不再更新https://element.eleme.cn/#/zh-CNelement-plus样式与element相同,开发都为了在vue3.x版本中使用而升级https://element-plus.gitee.io/zh-CN/vans主要针对移动端的UI......