JS定义类的六种方式详解以及几种常用的JS类定义方法

2023-11-02 21:58

本文主要是介绍JS定义类的六种方式详解以及几种常用的JS类定义方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在前端开发中,经常需要定义JS类。那么在JavaScript中,定义类的方式有几种,分别是什么呢?本文就JS定义类的六中方式说明如下(案例说明):

六种方式详解

1、工厂方式

function Car(){var ocar = new Object;ocar.color = "blue";ocar.doors = 4;ocar.showColor = function(){document.write(this.color)};return ocar;}var car1 = Car();var car2 = Car();

调用此函数时将创建新对象,并赋予它所有的属性和方法。使用此函数可以创建2个属性完全相同的对象。

当然可以通过给它传递参数来改版这种方式。

function Car(color,door){var ocar = new Object;ocar.color = color;ocar.doors = door;ocar.showColor = function(){document.write(this.color)};return ocar;}var car1 = Car("red",4);var car2 = Car("blue",4);car1.showColor() //output:"red"car2.showColor() //output:"blue"

现在可以通过给函数传递不同的参数来得到具有不同值的对象。

在前面的例子中,每次调用函数Car(),都要创建showcolor(),意味着每个对象都有一个自己的showcolor()方法。

但是事实上,每个对象斗共享了同一个函数。 虽然可以在函数外定义方法,然后通过将函数的属性指向该方法。

function showColor() {alert(this.color);}function Car() {var ocar = new Object();ocar.color = color;ocar.doors = door;ocar.showColor = showColor;return ocar;}

但是这样看起来不像是函数的方法。

2、构造函数方式

构造函数方式同工厂方式一样简单,如下所示:

function Car(color,door){this.color = color;this.doors = door;this.showColor = function(){alert(this.color)};}var car1 = new Car("red",4);var car2 = new Car("blue",4);

可以看到构造函数方式在函数内部没有创建对象,是用this关键字。因为在调用构造函数时已经创建了对象,而在函数内部只能用this来访问对象属性。

现在用new来创建对象,看起来像那么回事了!但是它同工厂方式一样。每次调用都会为对象创建自己的方法。

3、原型方式

该方式利用了对象的prototype属性。首先用空函数创建类名,然后所有的属性和方法都被赋予prototype属性。

function Car(){}Car.prototype.color = "red";Car.prototype.doors = 4;Car.prototype.showColor = function(){alert(this.color);}var car1 = new Car();var car2 = new Car();

在这段代码中,首先定义了一个空函数,然后通过prototype属性来定义对象的属性。调用该函数时,原型的所有属性都会立即赋予要创建的对象,所有该函数的对象存放的都是指向showColor()的指针,语法上看起来都属于同一个对象。

但是这个函数没有参数,不能通过传递参数来初始化属性,必须要在对象创建后才能改变属性的默认值。

原型方式有个很严重的问题就是当属性指向的是对象时,如数组。

function Car(){}Car.prototype.color = "red";Car.prototype.doors = 4;Car.prototype.arr = new Array("a","b");Car.prototype.showColor = function(){alert(this.color);}var car1 = new Car();var car2 = new Car();car1.arr.push("cc");alert(car1.arr); //output:aa,bb,ccalert(car2.arr); //output:aa,bb,cc

这里由于数组的引用值,Car的两个对象指向的都是同一个数组,所以当在car1添加值后,在car2中也可以看到。

联合是用构造函数/原型方式就可以像其他程序设计语言一样创建对象,是用构造函数定义对象的非函数属性,用原型方式定义对象的方法。

function Car(color,door){this.color = color;this.doors = door;this.arr = new Array("aa","bb");}Car.prototype.showColor = function () {alert(this.color);}var car1 = new Car("red",4);var car2 = new Car("blue",4);car1.arr.push("cc");alert(car1.arr); //output:aa,bb,ccalert(car2.arr); //output:aa,bb

5、动态原型方式

动态原型的方式同混合的构造函数/原型方式原理相似。唯一的区别就是赋予对象方法的位置。

function Car(color,door){this.color = color;this.doors = door;this.arr = new Array("aa","bb");if(typeof Car._initialized == "undefined"){Car.prototype.showColor = function(){alert(this.color);};Car._initialized = true;}}

动态原型方式是使用一个标志来判断是否已经给原型赋予了方法。这样可以保证该方法只创建一次

6、混合工厂方式

它的目的师创建假构造函数,只返回另一种对象的新实例。

function Car(){var ocar = new Object();ocar.color = "red";ocar.doors = 4;ocar.showColor = function(){alert(this.color)};return ocar;}

与工厂方式所不同的是,这种方式使用new运算符。

以上就是全部的创建对象方法。目前使用最广泛的就是混合构造函数/原型方式,此外,动态原型方式也很流行。在功能上与构造函数/原型方式等价。

几种常用的JS类定义方法

方法1 对象直接量

var obj1 = {v1 : "",get_v1 : function() {return this.v1;},set_v1 : function(v) {this.v1 = v;}
};

方法2 定义函数对象

var Obj = function() {var v1 = "";this.get_v1 = function() {return this.v1;};this.set_v1 = function(v) {this.v1 = v;}
};

方法3 原型继承

var Obj3 = new Function();
Obj3.prototype = {v1 : "",get_v1 : function() {return this.v1;},set_v1 : function(v) {this.v1 = v;}
};

方法4 工厂模式

function loadObj() {var tmp = new Object();tmp.v1 = "";tmp.get_v1 = function() {return tmp.v1;};tmp.set_v1 = function(v) {tmp.v1 = v;};return tmp;
}
obj1.set_v1('hello1');
alert(obj1.get_v1());var obj2 = new Obj();
obj2.set_v1('hello2');
alert(obj2.get_v1());var obj3 = new Obj();
obj3.set_v1('hello3');
alert(obj3.get_v1());var obj4 = loadObj();
obj4.set_v1('hello4');
alert(obj4.get_v1());alert(obj1);
alert(obj2);
alert(obj3);
alert(obj4);

这篇关于JS定义类的六种方式详解以及几种常用的JS类定义方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/333571

相关文章

Java使用ANTLR4对Lua脚本语法校验详解

《Java使用ANTLR4对Lua脚本语法校验详解》ANTLR是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件,下面就跟随小编一起看看Java如何使用ANTLR4对Lua脚本... 目录什么是ANTLR?第一个例子ANTLR4 的工作流程Lua脚本语法校验准备一个Lua Gramm

一文详解如何在Python中从字符串中提取部分内容

《一文详解如何在Python中从字符串中提取部分内容》:本文主要介绍如何在Python中从字符串中提取部分内容的相关资料,包括使用正则表达式、Pyparsing库、AST(抽象语法树)、字符串操作... 目录前言解决方案方法一:使用正则表达式方法二:使用 Pyparsing方法三:使用 AST方法四:使用字

Python列表去重的4种核心方法与实战指南详解

《Python列表去重的4种核心方法与实战指南详解》在Python开发中,处理列表数据时经常需要去除重复元素,本文将详细介绍4种最实用的列表去重方法,有需要的小伙伴可以根据自己的需要进行选择... 目录方法1:集合(set)去重法(最快速)方法2:顺序遍历法(保持顺序)方法3:副本删除法(原地修改)方法4:

python logging模块详解及其日志定时清理方式

《pythonlogging模块详解及其日志定时清理方式》:本文主要介绍pythonlogging模块详解及其日志定时清理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录python logging模块及日志定时清理1.创建logger对象2.logging.basicCo

JS+HTML实现在线图片水印添加工具

《JS+HTML实现在线图片水印添加工具》在社交媒体和内容创作日益频繁的今天,如何保护原创内容、展示品牌身份成了一个不得不面对的问题,本文将实现一个完全基于HTML+CSS构建的现代化图片水印在线工具... 目录概述功能亮点使用方法技术解析延伸思考运行效果项目源码下载总结概述在社交媒体和内容创作日益频繁的

前端CSS Grid 布局示例详解

《前端CSSGrid布局示例详解》CSSGrid是一种二维布局系统,可以同时控制行和列,相比Flex(一维布局),更适合用在整体页面布局或复杂模块结构中,:本文主要介绍前端CSSGri... 目录css Grid 布局详解(通俗易懂版)一、概述二、基础概念三、创建 Grid 容器四、定义网格行和列五、设置行

Node.js 数据库 CRUD 项目示例详解(完美解决方案)

《Node.js数据库CRUD项目示例详解(完美解决方案)》:本文主要介绍Node.js数据库CRUD项目示例详解(完美解决方案),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考... 目录项目结构1. 初始化项目2. 配置数据库连接 (config/db.js)3. 创建模型 (models/

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

SQL表间关联查询实例详解

《SQL表间关联查询实例详解》本文主要讲解SQL语句中常用的表间关联查询方式,包括:左连接(leftjoin)、右连接(rightjoin)、全连接(fulljoin)、内连接(innerjoin)、... 目录简介样例准备左外连接右外连接全外连接内连接交叉连接自然连接简介本文主要讲解SQL语句中常用的表

C#TextBox设置提示文本方式(SetHintText)

《C#TextBox设置提示文本方式(SetHintText)》:本文主要介绍C#TextBox设置提示文本方式(SetHintText),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录C#TextBox设置提示文本效果展示核心代码总结C#TextBox设置提示文本效果展示核心代