JavaScript面向对象设计二 构造函数模式

yizhihongxing

JavaScript 面向对象设计二 构造函数模式

构造函数和普通函数的区别

在JavaScript中,构造函数和普通函数的区别在于函数的调用方式不同。

普通函数使用 function 声明,调用方式是 函数名()

而构造函数使用 function 声明,调用方式是使用 new 操作符来调用。

构造函数模式的基本使用方法

构造函数通常用来创建一个对象,并对对象进行初始化。

function Person(name, age, gender) {
  this.name = name;
  this.age = age;
  this.gender = gender;
}

const person1 = new Person('张三', 18, '男');
console.log(person1); // {name: '张三', age: 18, gender: '男'}

const person2 = new Person('李四', 20, '女');
console.log(person2); // {name: '李四', age: 20, gender: '女'}

在上面的代码中,我们定义了一个构造函数 Person,它有3个参数 nameagegender。当我们使用 new 操作符来调用这个函数时,它会创建一个新的对象,并将这个对象的属性设置为传入的参数,最后返回这个新的对象。

构造函数内部的this指向

在构造函数内部,this 指向新创建的对象。

function Person(name, age, gender) {
  console.log(this); // Person {}
  this.name = name;
  this.age = age;
  this.gender = gender;
}

const person = new Person('张三', 18, '男');
console.log(person); // {name: '张三', age: 18, gender: '男'}

上面的代码中,当我们在 Person 构造函数内部使用 console.log(this) 输出 this 时,它指向一个空对象 {}。这是因为在使用 new 操作符调用 Person 函数时,它会将 this 指向一个新的空对象,然后再将这个新对象返回。

构造函数中的方法和属性

在构造函数中,我们可以定义方法和属性。方法和属性可以对创建的对象进行操作,也可以通过对象来访问和修改。

function Person(name, age, gender) {
  this.name = name;
  this.age = age;
  this.gender = gender;
  this.sayHello = function () {
    console.log(`Hello, my name is ${this.name},I am ${this.age} years old.`);
  }
}

const person = new Person('张三', 18, '男');
console.log(person); // {name: '张三', age: 18, gender: '男'}

person.sayHello(); // Hello, my name is 张三,I am 18 years old.

在上面的代码中, Person 构造函数中定义了一个 sayHello 方法,用来打印对象的 nameage。在 person 对象上使用 sayHello() 方法时,它将输出 Hello, my name is 张三,I am 18 years old.

构造函数模式的缺陷

构造函数模式也存在一些缺陷。

  • 每个函数都有自己的方法和属性,造成内存的浪费。
  • 所有方法都得在函数内部定义,导致代码重复,不利于代码维护。

可以使用原型链模式对其进行改进。

构造函数模式和原型链模式的结合

可以将对象的方法和属性定义在构造函数的原型上,从而让所有对象共享这些方法和属性,减少代码量,提高效率。

function Person(name, age, gender) {
  this.name = name;
  this.age = age;
  this.gender = gender;
}

Person.prototype.sayHello = function () {
  console.log(`Hello, my name is ${this.name},I am ${this.age} years old.`);
}

const person = new Person('张三', 18, '男');
console.log(person); // {name: '张三', age: 18, gender: '男'}

person.sayHello(); // Hello, my name is 张三,I am 18 years old.

示例:创建一个图形对象

function Shape(x, y) {
  this.x = x;
  this.y = y;
}

Shape.prototype.move = function (x, y) {
  this.x += x;
  this.y += y;
  console.log(`Shape moved to (${this.x}, ${this.y})`);
}

function Rectangle(x, y, width, height) {
  Shape.call(this, x, y);
  this.width = width;
  this.height = height;
}

Rectangle.prototype = Object.create(Shape.prototype);
Rectangle.prototype.constructor = Rectangle;

Rectangle.prototype.draw = function() {
  console.log('Drawing a Rectangle');
}

const rect = new Rectangle(0, 0, 100, 100);
rect.move(10, 10); // Shape moved to (10, 10)
rect.draw(); // Drawing a Rectangle

在上述示例中,我们定义了一个 Shape 构造函数,它包含两个属性 xy,还有一个 move 方法。

然后我们创建了一个 Rectangle 构造函数,它继承自 Shape 构造函数,包含 widthheight 两个属性,还有一个 draw 方法。

我们使用 Object.create 方法来定义 Rectangle 构造函数的原型对象,并将其设置为 Shape.prototype。这样 Rectangle 就可以继承到 Shape 的所有方法和属性。

最后我们创建了一个 rect 对象,它调用了 movedraw 方法。

示例:创建一个按钮对象

function Button(config) {
  this.width = config.width || 150;
  this.height = config.height || 50;
  this.color = config.color || 'red';
  this.text = config.text || 'Click me!';
  this.$el = document.createElement('button');
}

Button.prototype.render = function (target) {
  this.$el.style.width = this.width + 'px';
  this.$el.style.height = this.height + 'px';
  this.$el.style.background = this.color;
  this.$el.innerHTML = this.text;
  target.appendChild(this.$el);
}

const button = new Button({ width: 200, height: 60, color: 'blue', text: 'Submit' });
button.render(document.body);

在上述示例中,我们定义了一个 Button 构造函数,它通过传入一个配置对象来设置按钮的一些属性。然后我们在构造函数中创建了一个 HTML 按钮元素,并定义了一个 render 方法将按钮元素渲染到指定的页面元素上。

最后我们创建了一个 button 对象,将它渲染到页面上。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript面向对象设计二 构造函数模式 - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • Excel如何在单元格内批量加前缀或后缀?

    当你需要在Excel中批量给单元格添加前缀或后缀时,可以使用以下步骤: 首先,打开Excel并选择你要操作的工作表。 选中你要添加前缀或后缀的单元格范围。你可以使用鼠标拖动来选中多个单元格,或者按住Ctrl键并单击选择多个单元格。 在Excel的顶部菜单栏中,点击\”开始\”选项卡。 在\”编辑\”组中,找到并点击\”查找和替换\”按钮。这将打开一个弹出窗口…

    other 2023年8月5日
    00
  • redis击穿 雪崩 穿透超详细解决方案梳理

    关于 Redis 的击穿、雪崩、穿透问题,我给出如下完整攻略: Redis 击穿、雪崩、穿透问题解决方案梳理 Redis 基础 为了更好理解 Redis 击穿、雪崩、穿透,我们先来了解一下 Redis 的基础知识。 Redis 是一个开源的内存数据库,它支持多种数据结构,并提供对这些数据结构的读写操作。Redis 能够存储的数据类型有字符串、列表、集合、散列…

    other 2023年6月26日
    00
  • c语言 指针零基础讲解

    C语言指针零基础讲解 什么是指针? 在C语言中,指针是一种特殊类型的变量,它存储着另一个变量的地址,也就是说,指针变量指向另一个变量的内存地址。我们可以通过解引用操作符*来获取指针指向的变量的值。 指针的定义和声明 指针的定义和声明可以分开进行。指针变量的定义包括指定指针类型和变量名,例如: int *p; char *s; double *d; 这里的*表…

    other 2023年6月27日
    00
  • 20191031:python取反运算详解

    20191031:Python取反运算详解 Python是一种强大的编程语言,为程序员提供了丰富的运算符,包括取反运算符。在本文中,我们将探讨Python中的取反运算符几种形式和用法。 取反运算符的基本概念 取反运算符通常表示为“!”。简单来说,取反运算符会将一个布尔值从True变为False,或者从False变为True。在Python中,为了避免与比较运…

    其他 2023年3月28日
    00
  • 微信开发者工具怎么折叠代码?微信开发者工具折叠代码教程

    微信开发者工具是一款用于开发和调试微信小程序的工具。在开发过程中,我们经常需要处理大量的代码,为了提高代码的可读性和维护性,可以使用微信开发者工具提供的代码折叠功能。 要折叠代码,可以按照以下步骤进行操作: 打开微信开发者工具,并进入小程序项目。 在左侧的文件树中,找到需要折叠代码的文件,双击打开。 在代码编辑器中,找到需要折叠的代码块。 将鼠标放置在代码块…

    other 2023年7月27日
    00
  • Spring IOC原理补充说明(循环依赖、Bean作用域等)

    下面我会详细讲解Spring IOC原理补充说明,包括循环依赖和Bean的作用域。 Spring IOC原理 Spring IOC(Inversion of Control)是Spring框架的核心模块,也是最基础的模块,用来管理对象的生命周期和对象之间的依赖关系。在Spring IOC容器中,Bean是容器的基本构建块,而容器负责创建、配置、管理和销毁Be…

    other 2023年6月27日
    00
  • 从零开始学习SQL查询语句执行顺序

    很抱歉,作为文本模型,我无法以标准的markdown格式回答您的问题。但是,我可以为您提供一份详细的攻略,包含从零开始学习SQL查询语句执行顺序的完整步骤和两个示例说明。 从零开始学习SQL查询语句执行顺序 步骤1:了解SQL查询语句的基本结构 SQL查询语句通常由多个关键字和子句组成,包括SELECT、FROM、WHERE、GROUP BY、HAVING和…

    other 2023年10月17日
    00
  • 在ASP.NET 2.0中操作数据之十三:在DetailsView控件中使用TemplateField

    ASP.NET 2.0中的DetailsView控件是一个数据录入控件,可以绑定数据源并将数据显示在一个包含字段标签和相应值的表格中。在某些情况下,需要使用自定义模板来显示控件中的数据。这时候就需要使用到DetailsView控件中的TemplateField模板。 下面是在ASP.NET 2.0中使用DetailsView控件中的TemplateField…

    other 2023年6月26日
    00
合作推广
合作推广
分享本页
返回顶部