热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Javascript陈词滥调之面向对象

背景作为一个前端新人,免不了加各种群,和其他小伙伴们一同进修(chuibi),互相帮助(bican)。头几天一个小伙伴在群里发了道本身去口试的笔试题,我写了一下,一时间没能完成,本
背景

作为一个前端新人,免不了加各种群,和其他小伙伴们一同进修(chui bi),互相帮助(bi can)。头几天一个小伙伴在群里发了道本身去口试的笔试题,我写了一下,一时间没能完成,本日又折腾了一下,虽然大抵完成了,但不晓得是不是文雅,分享本身解法的同时也想请大佬指导一二。

题目

编写一个名字为Person的对象,请求

  • 有一个name属性,外部只能接见不能修正,初始化时赋值。

  • 内部保护一个叫things的局部变量,数组范例,用于存储购置的物品(something)清单。

  • 有一个buy(something)要领,用于购置物品(something)

  • 具有count属性,用于指导一共买了若干物品。

剖析

看到这题的第一回响反映就是用组织函数/class来写。Person对象应当就是一个Person类。
两个属性一个要领,嗯,没什么题目。只要2个点须要斟酌:

一、 这个things局部变量是个啥?是属性吗?

  • 应当不是,既然特地指出了,一定有他的斟酌,那末既然是局部变量,外部也是接见不到的,这个应当用闭包写。

二、 name属性外部只能接见不能修正.

  • 这个用闭包也能处理,然则如许记不能经由过程组织函数/class来完成了,背离了初志,不可(不过我背面照样会给出这类写法)。那末(以我的程度)就只能用Proxy或许class,这2个都能阻拦对象属性的读/写。2种我都试过,采纳Proxy,缘由下面会讲。

代码

class Person {
constructor(name,count=0) {
this.name = name;
this.count = count;
this.init()
}
//初始化函数
init() {
var things = [];
Person.prototype.buy = (something) => { //为了构成闭包,显式将buy要领写到Person的原型上
things.push(something);
this.count = things.length;
}
}
}
//Proxy handler对象,定义行动
var handler = {
set(target,prop,value,receiver) {//阻拦set行动
if(prop == 'name') {
throw Error('不能够哦') //这里自定义你的逻辑,也能够alert等。
}
Reflect.set(target,prop,value,receiver) //不要忘了对其他属性'放行'
}
}
var p1 = new Proxy(new Person('张三'),handler)
console.log(p1.name) //张三
p1.name = '李四' //Error:不能够哦
p1.buy('猫粮');
p1.buy('猫砂');
console.log(p1.count) //2
//假如须要从'内部'修正p1的名字,则须要先对被代办对象举行定义
var _p1 = new Person('张三');
var p1 = new Proxy(_p1,handler)
console.log(p1.name); //张三
_p1.name = '李四';
console.log(p1.name) //李四

以上我对这道题的明白。至于为何不必class的setter,是由于如许写后,在new Person的时刻不能传name进去,由于一传进去就会被阻拦。所以只能先初始化对name赋值,再举行proxy代办对name阻拦。

另一种“野门路”写法

var Person = function(name,count=0) {
var things = [],name = name
result = {
count = count;
};
result.__proto__ = {
buy:function(something) {
things.push(something);
result.count = things.length;
},
getName:function() { // 经由过程getName函数来猎取名字
return name;
}
}
return result;
}
var p2 = Person('王五');
p2.getName() //王五
p2.name = 123;
p2.getName() //王五
p2.buy('妙鲜包');
console.log(p2.count) // 1

两种要领见仁见智,第二种野门路不必Proxy代办,返回的是Object对象,而第一种正规军则返回Person对象,更相符题意。

结语

写到这不晓得人人发现了没。 实在第一种要领也能够不须要proxy代办,再init函数中定义name = this.name,再在Person原型上写一个getName函数,如许2种要领的长处就结合到一同了Σ(っ °Д °;)っ
这2小时没有白花,这文章没有白写,又赚到了^ ^。
愿望能给人人带来一点点收成,假如有差别的意见能够留言一同讨论()。

Thanks for reading


推荐阅读
  • 本文介绍了在wepy中运用小顺序页面受权的计划,包含了用户点击作废后的从新受权计划。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 本文详细解析了JavaScript中相称性推断的知识点,包括严厉相称和宽松相称的区别,以及范例转换的规则。针对不同类型的范例值,如差别范例值、统一类的原始范例值和统一类的复合范例值,都给出了具体的比较方法。对于宽松相称的情况,也解释了原始范例值和对象之间的比较规则。通过本文的学习,读者可以更好地理解JavaScript中相称性推断的概念和应用。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • JavaScript设计模式之策略模式(Strategy Pattern)的优势及应用
    本文介绍了JavaScript设计模式之策略模式(Strategy Pattern)的定义和优势,策略模式可以避免代码中的多重判断条件,体现了开放-封闭原则。同时,策略模式的应用可以使系统的算法重复利用,避免复制粘贴。然而,策略模式也会增加策略类的数量,违反最少知识原则,需要了解各种策略类才能更好地应用于业务中。本文还以员工年终奖的计算为例,说明了策略模式的应用场景和实现方式。 ... [详细]
  • PHP中的单例模式与静态变量的区别及使用方法
    本文介绍了PHP中的单例模式与静态变量的区别及使用方法。在PHP中,静态变量的存活周期仅仅是每次PHP的会话周期,与Java、C++不同。静态变量在PHP中的作用域仅限于当前文件内,在函数或类中可以传递变量。本文还通过示例代码解释了静态变量在函数和类中的使用方法,并说明了静态变量的生命周期与结构体的生命周期相关联。同时,本文还介绍了静态变量在类中的使用方法,并通过示例代码展示了如何在类中使用静态变量。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文介绍了最长上升子序列问题的一个变种解法,通过记录拐点的位置,将问题拆分为左右两个LIS问题。详细讲解了算法的实现过程,并给出了相应的代码。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 在编写业务代码时,常常会遇到复杂的业务逻辑导致代码冗长混乱的情况。为了解决这个问题,可以利用中间件模式来简化代码逻辑。中间件模式可以帮助我们更好地设计架构和代码,提高代码质量。本文介绍了中间件模式的基本概念和用法。 ... [详细]
  • 本文介绍了如何使用动态尺寸巧妙地将R中的数组子集化。作者通过解释数组的三个维度以及第三个维度的长度可变性,提出了一种周期性子集化数组的方法,并举例说明了如何创建第二个数组。这个方法对于制作模拟模型非常有用。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
author-avatar
peteryan
自我学习,提升,早日被动大于主动,实现自由
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有