js实例对象与 new 命令

面向对象编程(Object Oriented Programming,缩写为 OOP)是目前主流的编程范式。它将真实世界各种复杂的关系,抽象为一个个对象,然后由对象之间的分工与合作,完成对真实世界的模拟。
那么,“对象”(object)到底是什么?我们从两个层次来理解。

(1)对象是单个实物的抽象。

一本书、一辆汽车、一个人都可以是对象,一个数据库、一张网页、一个与远程服务器的连接也可以是对象。当实物被抽象成对象,实物之间的关系就变成了对象之间的关系,从而就可以模拟现实情况,针对对象进行编程。

(2)对象是一个容器,封装了属性(property)和方法(method)。

属性是对象的状态,方法是对象的行为(完成某种任务)。比如,我们可以把动物抽象为animal对象,使用“属性”记录具体是那一种动物,使用“方法”表示动物的某种行为(奔跑、捕猎、休息等等)。

面向对象编程的第一步,就是要生成对象。前面说过,对象是单个实物的抽象。通常需要一个模板,表示某一类实物的共同特征,然后对象根据这个模板生成。

典型的面向对象编程语言(比如 C++ 和 Java),都有“类”(class)这个概念。所谓“类”就是对象的模板,对象就是“类”的实例。但是,JavaScript 语言的对象体系,不是基于“类”的,而是基于构造函数(constructor)和原型链(prototype)。

JavaScript 语言使用构造函数(constructor)作为对象的模板。所谓”构造函数”,就是专门用来生成实例对象的函数。它就是对象的模板,描述实例对象的基本结构。一个构造函数,可以生成多个实例对象,这些实例对象都有相同的结构
构造函数就是一个普通的函数,但是有自己的特征和用法

var Vehicle = function () {
  this.price = 1000;
};

上面代码中,Vehicle就是构造函数。为了与普通函数区别,构造函数名字的第一个字母通常大写
1.new 命令
new命令的作用,就是执行构造函数,返回一个实例对象

var Vehicle = function () {
  this.price = 1000;
};

var v = new Vehicle();
v.price // 1000

上面代码通过new命令,让构造函数Vehicle生成一个实例对象,保存在变量v中。这个新生成的实例对象,从构造函数Vehicle得到了price属性。new命令执行时,构造函数内部的this,就代表了新生成的实例对象,this.price表示实例对象有一个price属性,值是1000

2.new命令的原理
使用new命令时,它后面的函数依次执行下面的步骤

  1. 创建一个空对象,作为将要返回的对象实例
  2. 将这个空对象的原型,指向构造函数的prototype属性
  3. 将这个空对象赋值给函数内部的this关键字
  4. 开始执行构造函数内部的代码

也就是说,构造函数内部,this指的是一个新生成的空对象,所有针对this的操作,都会发生在这个空对象上。构造函数之所以叫“构造函数”,就是说这个函数的目的,就是操作一个空对象(即this对象),将其“构造”为需要的样子。
如果构造函数内部有return语句,而且return后面跟着一个对象,new命令会返回return语句指定的对象;否则,就会不管return语句,返回this对象。

var Vehicle = function () {
  this.price = 1000;
  return 1000;
};

(new Vehicle()) === 1000
// false
var Vehicle = function (){
  this.price = 1000;
  return { price: 2000 };
};

(new Vehicle()).price
// 2000

3.Object.create() 创建实例对象
构造函数作为模板,可以生成实例对象。但是,有时拿不到构造函数,只能拿到一个现有的对象。我们希望以这个现有的对象作为模板,生成新的实例对象,这时就可以使用Object.create()方法

var person1 = {
  name: '张三',
  age: 38,
  greeting: function() {
    console.log('Hi! I\'m ' + this.name + '.');
  }
};

var person2 = Object.create(person1);

person2.name // 张三
person2.greeting() // Hi! I'm 张三.

上面代码中,对象person1是person2的模板,后者继承了前者的属性和方法。

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 NestJS 中,创建一个完整的接口实例需要经过以下几个步骤: 1. 创建一个控制器(Controller):控制器是处理请求并返回响应的地方。可以使用 Nest CLI 命令 `nest generate controller` 快速生成一个控制器文件。例如,创建一个名为 `cats` 的控制器: ```bash $ nest generate controller cats ``` 2. 在控制器中定义路由和请求处理方法:在 `cats.controller.ts` 文件中,可以使用装饰器 `@Get`、`@Post`、`@Put`、`@Delete` 等来定义不同的 HTTP 请求方法,并指定对应的路由路径。例如: ```typescript import { Controller, Get, Post, Body } from '@nestjs/common'; @Controller('cats') export class CatsController { @Get() findAll(): string { return 'This action returns all cats'; } @Post() create(@Body() createCatDto: CreateCatDto): string { return `This action creates a new cat with name ${createCatDto.name}`; } } ``` 3. 创建一个数据传输对象(DTO):DTO 是用于在请求和响应中传递数据的对象。可以使用 Nest CLI 命令 `nest generate dto` 快速生成一个 DTO 文件。例如,创建一个名为 `create-cat.dto.ts` 的 DTO: ```bash $ nest generate dto create-cat ``` 在 `create-cat.dto.ts` 文件中定义需要传递的属性: ```typescript export class CreateCatDto { readonly name: string; readonly age: number; readonly breed: string; } ``` 4. 在模块中引入控制器和 DTO:在相应的模块文件中,使用 `@Module` 装饰器引入控制器和 DTO。例如,在 `app.module.ts` 文件中引入 `CatsController` 和 `CreateCatDto`: ```typescript import { Module } from '@nestjs/common'; import { CatsController } from './cats.controller'; @Module({ controllers: [CatsController], }) export class AppModule {} ``` 5. 启动 NestJS 应用程序:在入口文件(通常是 `main.ts`)中使用 `NestFactory` 创建应用实例,并指定要监听的端口。例如: ```typescript import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; async function bootstrap() { const app = await NestFactory.create(AppModule); await app.listen(3000); } bootstrap(); ``` 这样,你就创建了一个完整的接口实例,并且可以通过访问对应的路由路径来触发相应的请求处理方法。例如,通过访问 `GET /cats` 可以调用 `findAll` 方法返回所有猫咪的信息。 注意:以上仅为一个简单示例,实际应用中可能需要更复杂的业务逻辑和数据持久化操作。你可以根据自己的需求进行进一步的开发和定制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值