Object.defineProperties是什么?有什么用?

这个问题比较听起来可能比较难以理解,确实我也是在项目中遇到的才会去想。以前看到《高级程序设计》的时候,有这么一种东西,定义一个对象。
大概第几章忘了,看下下面的代码估计能想起来是什么。

var User = {}; //声明一个空对象
Object.defineProperties(User, { //填充对象属性
_id: {
writable: true, //设置属性是否可写,默认为true
configurable: false, //设置属性是否可以配置,默认为true。当设置为false时不能用delete删除
enumerable: false, //设置属性是否可以枚举,默认为true.即for-in循环对象的时候可以输出属性
value: 0 //默认值
},
id: {
set: function(value) {
if(value > 0) {
this._id = value; //数据库设置的为主键从0开始递增
}
},
get: function() {
return this._id;
}
}
}); var privateId = Object.getOwnPropertyDescriptor(User, '_id');
console.log(privateId.value); //0 var userId = Object.getOwnPropertyDescriptor(User, 'id');
console.log(userId.get()); //还没设置呢,输出undefined userId.set(10); //设置id为10
console.log(userId.get()); //输出10,设置有效 userId.set(-10);
console.log(userId.get()); //输出10,设置无效

大概就是Object.defineProperties这个东西吧,可以定义属性。定义一个属性用的是Object.defineProperty。不过通常对象都是多个属性的啦,所以基本用的都是Object.defineProperties

其实刚开始我看到这个属性觉得——嗯,有这个东西。但是具体哪里会用到,有什么作用,还真的没去思考太多。只是知道有这个东西,但是普通的前端开发,貌似也没怎么用到这个东西,直到——做项目的时候遇到了-_-!!

MEAN开发Model层的写法

副标题扯到MEAN开发了,之前做的项目里面,前端用的是AngularJS,后台用的是ExpressJS+node.js
数据交互不用想都知道是Ajax啦。

所以从第一天开始就开开心心撸代码啦,嗯,差不多就这样。^_^

写后台的时候遇到了几个坑爹的问题吧,首先是登陆模块。
AngularJS用$httppost到/loginData一个表单到后台

比如是下面这样的

var json = {
username: "ManfredHu",
password: "123456"
};

后台用ExpressJS的路由监听这个URI

app.post('/loginData', function(req, res) {
console.log("接受到login页面的登陆信息");
//调用login控制器传入req,res
UserCtrl.login(req, res);
});

这个ExpressJS的路由其实类似JavaWeb里面的web.xml那个配置servlet的东西。就是一个请求过来,你到底要调用哪个Controller到处理。
这里专门为User写了个Controller取名UserCtrl,通过CMD的形式组织,exports暴露了一个login的方法专门处理request/response。

然后问题就坑爹了,前端数据的验证怎么做?如果直接将JSON传入Dao层执行数据库的查找等等的匹配操作。那么其实问题其实还挺大的,你要考虑如果有人专门来POST数据测试你的服务器呢?当然我相信大家都是好人不会去干这种事,不过从安全性来讲,应该是要有一层验证的,而且后面的Dao层也会接受一个对象去执行增删查改等等操作

这里讲的是后台的数据验证

所以上面的Object.defineProperties就派上用场了,应该要将这个json组装成一个Model,且这个Model应该有类似C#、Java一样的私有属性private、公有方法public等等。

C#的属性的概念其实相比字段就是多了一层过滤层,因为属性都是合法的字段。

public class Student
{
private string name; //字段
public string Name //属性
{
set
{
name=value; //这里是给私有属性name赋值
}
get
{
return name; //这里取出私有属性name的值
}
}
}

Java的类似,不过没有C#属性的概念,所有的都称为方法。

public class Student {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}

所以其实JavaScript要模仿这些传统的后台,也要有一个类似类的概念的东西——Object.defineProperties

上面的代码类似声明了一个类,定义了私有的属性_id,公有的方法id,里面有setget方法。
那其实思路就变得很简单了,将POST的JSON数据包装成Model(这个过程会检验属性的正确性),然后对Model进行DAO操作。
JavaScript模拟传统后台的东西就完全出来了。

当然其实这部分包装成Model的过程完全可以不考虑,但是验证的过程你要写在Controller或者其他地方,既然都要写的,那还不如像传统后台一样多一层Model层。
而且运行node.js的Chrome的V8解析器完全可以忽略Object.defineProperties的兼容性问题。

综上所述,Object.defineProperties在开发后台的时候,用处非常大。可以用来创建实体类。

Object.defineProperties——MEAN开发后台的Model层的更多相关文章

  1. MVC5中Model层开发数据注解

    ASP.NET MVC5中Model层开发,使用的数据注解有三个作用: 数据映射(把Model层的类用EntityFramework映射成对应的表) 数据验证(在服务器端和客户端验证数据的有效性) 数 ...

  2. MVC5中Model层开发数据注解 EF Code First Migrations数据库迁移 C# 常用对象的的修饰符 C# 静态构造函数 MSSQL2005数据库自动备份问题(到同一个局域网上的另一台电脑上) MVC 的HTTP请求

    MVC5中Model层开发数据注解   ASP.NET MVC5中Model层开发,使用的数据注解有三个作用: 数据映射(把Model层的类用EntityFramework映射成对应的表) 数据验证( ...

  3. HTML5学习+javascript学习:打飞机游戏简介以及Model层

    本着好记性不如烂博客以及分享成功的喜悦和分享失败的苦楚,今天我来分享下一个练手项目:打飞机游戏~从小就自己想做游戏,可是一直没有机会.HTML5给了我们这个平台,这个平台可以有很多以前想都不敢想的东西 ...

  4. 项目架构开发:数据访问层之Query

    接上文 项目架构开发:数据访问层之Repository 上一章我们讲了IRepository接口,这张我们来讲IQuery 根据字面意思就可以知道,这次主要讲数据查询,上一章我们只针对单表做了查询的操 ...

  5. 读书笔记_MVC__关于通过js构建ORM,实现Model层

    最近一直在学习MVC构建富应用的WEB程序,自己一直对MVC的设计模式理解的不是十分透彻,终于在研读了github上Spine的源码之后,对构建Model层有了一点自己的理解. 本文仅为个人理解,如有 ...

  6. MVC系列之二 Model层细解

    一.简介 在上一篇将MVC的时候,有很有朋友对简单三层的概念不是很熟悉,因此,今天进行简单三层的一个简单介绍,同时为理解MVC中的Model做知识累计. 传统的三层主要指的是UI层,BLL层,DAL层 ...

  7. xadmin开发后台管理系统常见问题

    Xadmin开发后台管理系统 关注公众号"轻松学编程"了解更多. 添加小头像 https://blog.csdn.net/qq_34964399/article/details/8 ...

  8. MVC5 网站开发之四 业务逻辑层的架构和基本功能

    业务逻辑层在Ninesky.Core中实现,主要功能封装一些方法通过调用数据存储层,向界面层提供服务.   目录 奔跑吧,代码小哥! MVC5网站开发之一 总体概述 MVC5 网站开发之二 创建项目 ...

  9. pureMVC简单示例及其原理讲解二(Model层)

    本节将讲述Model层. Model层有VO和Mediator组成,非常简单,仅仅包含两个类:UserVO和UserProxy. UserVO中的构造器用于初始化用户的添加(通过email和密码),另 ...

随机推荐

  1. python学习笔记(二)— 集合

    s = set()#建立空的集合 s2 = {'}#没有:的为集合,集合天生去重 s3 = {'} #集合是也是无序的 # s2.add('a')#添加值 # s2.remove('2')#删除值 # ...

  2. MapReduce小文件优化与分区

    一.小文件优化 1.Mapper类 package com.css.combine; import java.io.IOException; import org.apache.hadoop.io.I ...

  3. RESTful API 设计最佳实践【转】

    背景 目前互联网上充斥着大量的关于RESTful API(为了方便,后面API和RESTful API 一个意思)如何设计的文章,然而却没有一个“万能”的设计标准:如何鉴权?API格式如何?你的API ...

  4. vSphere虚拟机磁盘热扩容

    1.添加硬盘 2.刷新服务器文件系统 新添加的硬盘需要刷新文件系统,要不然不能识别新添加的硬盘. 对scsi_host进行重新扫描,查找 scsi 驱动器的号 驱动号为scsi后面的数字,即为2,此时 ...

  5. Oracle 实现拆分列数据的split()方法

    -- 创建需要划分的字符串 with T1 as( select 'one,two,three,four,five,six,seven,eight,nine,zero' as source_strin ...

  6. ObjectDetection中的一些名词中英文对照

    mAP:mean Average Precision,平均精确度 recall rate:召回率 Loss Function Anchro

  7. DjangoORM 执行 python manage.py makemigrations出现 no changes detected

    出现 no changes detected python manage.py makemigrations No changes detected 为什么出现这种情况: 当执行这条命令,他会去找所有 ...

  8. Linux系统性能调优之性能分析

    1.Linux性能分析的目的1)找出系统性能瓶颈(包括硬件瓶颈和软件瓶颈):2)提供性能优化的方案(升级硬件?改进系统系统结构?):3)达到合理的硬件和软件配置:4)使系统资源使用达到最大的平衡.(一 ...

  9. jQuery异步加载数据并添加事件示例

    当时项目是通过树形栏进行权限控制的,管理员可以对从数据库去的数据动态生成树形栏进行增删改查操作,可是用$(".XX").click();方法是不行的. 1.之前用的是jq1.4.3 ...

  10. 怎么解决tomcat占用8080端口问题图文教程

     怎么解决tomcat占用8080端口问题 相信很多朋友都遇到过这样的问题吧,tomcat死机了,重启eclipse之后,发现 Several ports (8080, 8009) required ...