当前位置: 首页 > news >正文

自已电脑做网站c2c的典型代表有哪些

自已电脑做网站,c2c的典型代表有哪些,关于学校网站建设申请报告,商务网站建设包含了为什么要学?先看一段代码let aGoods {pic: ,title: ,desc: ,sellNumber: 1,favorRate: 2,price: 3 }class UIGoods {constructor(g) {this.data g} }let g new UIGoods(aGoods) console.log(g.data);这段存在问题吗?在功能这个层面, 是没问题的在设计这个层面, 存在设计缺…

为什么要学?

先看一段代码

let aGoods = {pic: '',title: '',desc: '',sellNumber: 1,favorRate: 2,price: 3
}class UIGoods {constructor(g) {this.data = g}
}let g = new UIGoods(aGoods)
console.log(g.data);

这段存在问题吗?

在功能这个层面, 是没问题的

在设计这个层面, 存在设计缺陷

// 按照我们的业务, data必须是一个商品对象
// 目前没有任何限制, 就可能埋下隐患, 带来更多的维护成本
g.data = 'abc'
console.log(g.data); 

作为码农, 我们专心把功能实现了就可以了

作为架构师, 我们要打造 "玩不坏" 的程序, 要从根本上杜绝问题的发生

属性描述符

属性描述符就是用来描述属性的特征

let obj = {a: 1,b: 2
}/*** 描述a的特征*/
// 值为1
console.log(obj.a);
// 可重写
obj.a = 10;
// ->可遍历
for (let key in obj) {console.log(key);
}let keys = Object.keys(obj)
console.log(keys);/*** 获取属性描述符* { value: 10, writable: true, enumerable: true, configurable: true }* value描述值* writable是否可重写* enumerable是否可遍历* configurable属性描述对象是否可修改*/
let desc = Object.getOwnPropertyDescriptor(obj, 'a');
console.log(desc);/***设置属性描述符*/
Object.defineProperty(obj, 'a', {value: 10,writable: false, // 不可重写enumerable: false, // 不可遍历configurable: false, // 不可修改描述符本身
})
obj.a = 'abc'
console.log(obj.a); // 10/*** 认识访问器* 读取器和设置器加起来就是访问器*/
Object.defineProperty(obj, 'a', {// 读取器getterget: function () {console.log("hello");return 123;},// 设置器setterset: function (val) {console.log(val);}
})
obj.a = 3 + 2 //为属性赋值就是调用set()方法, 相当于set(3+2), 这里打印5
console.log(obj.a) //读取属性值就是调用get()方法, 相当于get(), 这里打印hello后再打印123
// 更复杂的示例
obj.a = obj.a + 2 // set(get() + 2) => set(打印hello返回123 + 2) => set(125) => 打印125
console.log(obj.a); // 打印hello再打印123/*** 使用访问器设置属性值*/
// 一个错误的示范: Maximum call stack size exceeded(栈内存益出)
// 报错的原因: 死循环
Object.defineProperty(obj, 'a', {get: function () {return obj.a // 等价于get(),一直调用自己},set: function (val) {obj.a = val // 等价于set(val),一直调用自己}
})
obj.a = obj.a + 2
console.log(obj.a);// 正确的示范: 利用临时变量
let temp = null
Object.defineProperty(obj, 'a', {get: function () {return temp},set: function (val) {temp = val}
})
obj.a = obj.a + 2 // set( get() + 2) => set( null + 2) => set(2)
console.log(obj.a); // get() => 2 => 打印2/*** 使用设置器模拟属性只读*/
Object.defineProperty(obj, 'a', {get: function () {return 123},set: function (val) {throw new Error(`你正在给obj.a这个属性赋值,但它是只读的`)}
})
obj.a = 100 //报错: 你正在给obj.a这个属性赋值,但它是只读的

改造代码

通过属性描述符改造我们的代码, 让代码是坚固可靠

let aGoods = {pic: '',title: '',desc: '',sellNumber: 1,favorRate: 2,price: 3
}/*** 原始程序*/
// class UIGoods {
//   constructor(g) {
//     this.data = g
//   }
// }// let g = new UIGoods(aGoods)
// console.log(g.data);/*** 使用属性描述符改造程序* 目标: * 让data属性是只读的, 不会被篡改* 让choose属性的赋值更安全* 让totalPrice使用起来像属性* 保护原始数据不会被修改* 保护实例对象不被添加属性, 且自身属性可以不被影响* 保护对象原型不被添加属性或方法*/
class UIGoods {// es6提供了语法糖, 效果与下面的写法一致get isChoose() {return this.choose > 0}constructor(g) {g = { ...g } //克隆对象: 直接冻结原始对象, 会影响别人Object.freeze(g) // 冻结克隆对象, 保护对象的属性值不被更改Object.defineProperty(this, 'data', {get: function () {return g},set: function () {throw new Error('data属性是只读的')},configurable: false})let internalChooseValue = 0Object.defineProperty(this, 'choose', {configurable: false,get: function () {return internalChooseValue},set: function (val) {if (typeof val !== 'number') {throw new Error('choose属性是数字')}let temp = parseInt(val)if (temp !== val) {throw new Error('choose属性是整数')}if (val < 0) {throw new Error('choose属性必须 >= 0')}internalChooseValue = val}})Object.defineProperty(this, 'totalPrice', {get: function () {return this.choose * this.data.price}})// 不希望被人给自己加属性// 1.把自己冻结, 防止被添加属性, 弊端:其他不能被修改了// Object.freeze(this)// 2.对象密封: 不能添加属性, 但是对象已有的属性支持修改this.a = 1Object.seal(this)}
}Object.freeze(UIGoods.prototype) // 冻结原型, 防止随意添加东西let g = new UIGoods(aGoods)
/// g.data = 'abc' // 报错: data属性是只读的
g.choose = 2
console.log(g.totalPrice); // 6, 调用类似属性, 本质是函数g.data.peice = 100 // g.data只读, 但是原始数据还是可以篡改
console.log(g.data);  // { ..., peice: 100 }g.abd = 123 // 别人还能往对象上加属性
console.log(g); // { abd: 123  }g.a = 100 // 不能添加属性, 但是原有属性支持修改
console.log(g); // { a: 100  }UIGoods.prototype.haha = 'abc' // 还能往原型上加东西
console.log(g.haha);
http://www.dtcms.com/a/615592.html

相关文章:

  • 成都企业网站优化营销4p
  • 网站建设优化推广杭州贵州省交通建设集团网站
  • 做淘宝美工需要知道的网站建筑设计说明万能模板
  • 建设银行招生网站搜索引擎优化管理实验报告
  • js特效网站模板下载辽宁官方网站做辣白菜
  • 网站建设初期wordpress+并发量
  • 网站建设人员叫什么科目北京seo运营
  • 隆昌网站建设网站开发工作内容
  • 配方机制(2)
  • 什么样的网站是一个成功的网站汕头集团做网站方案
  • 网站管理系统源码青岛外贸建设网站制作
  • 石家庄网站制作系统手机网页游戏排行榜2021前十名
  • 做网站需要花费那方面的钱wordpress 发布文章sql
  • 教育网站 模板自助建站平台便宜
  • 如何做网站 百度经验网站 扩展
  • 介绍自己的做的网站吗企业网站推广费用
  • 阿里建站服务建设网站的网站是什么
  • 【每天一个AI小知识】:什么是决策树?
  • 基于百度地图的网站开发黄骅港邮政编码
  • 影视网站的设计与实现洮南网站
  • 黑马程序员苍穹外卖(新手) day2
  • 四川平台网站建设方案网站建设推广优化招聘模板
  • 外包网站开发合同范本自己做网站可以用私有云吗
  • 网站名注册百度收录入口
  • 用flash做的网站网站的经典推广方法
  • 代做毕设网站万户网络学校网站建设
  • nanochat 三 模型结构详解
  • 专门做水产海鲜的网站吗广东东莞厚街买婬女
  • 网站开发用php还pyt h on网站首页默认的文件名一般为
  • 园林网站免费模板国外做兼职网站