请教题目实现是否正确?

请教题目实现是否正确?

function Student(){

    var _privateStore = {};

    var _set = function(name, value){

        this[name] = value

    };

    var _get = function(name, value){

        return this[name];

    };

    this.set = function(name, value){

        return _set(name, value);

    }

    this.get = function(name, value){

        return _get(name, value);

    }

}

var student = new Student();

student.set("name", "张宇");

student.set("sex", "男");    

student.set("age", 18);

console.log(student.get("name")); 

console.log(student.get("sex"));

console.log(student.get("age"));


我看其他同学的例子好像是在set和get里面直接返回_set和_get, 请问我这个实现对吗? 

还有不清楚为什么不直接在get和set里面操作内部数据, 却还要调用_get和_set?

正在回答

登陆购买课程后可参与讨论,去登陆

3回答

同学你好,如果抛开此题,你这样实现是可以的,闭包理解的没有问题。而本题只是为了刻意练习闭包,代码中_set和_get也只是单纯的return出去而已。

另外实际在库设计时,内部的实现往往在内部,然后接口操作,而不是在对外的接口上实现。也就是一般都在_set和_get中操作_privateStore。

祝学习愉快!

好帮手慕星星 2020-01-17 09:57:36

同学你好,这道题主要是利用闭包的特性来实现

http://img1.sycdn.imooc.com//climg/5e21141e09ced50005330097.jpg

同学那样写就是一个普通的构造函数,没有用闭包实现。

另外在控制台中是可以看到代码,但是对外提供的接口只有set和get,无法操作函数内部私有内容,安全性指的是这方面。

祝学习愉快!

  • 提问者 慕移动3569406 #1
    嗯嗯, 那跳脱题目的要求, 这样实现是否是好的实现呢? set、get和_set、_get的区别还是有点不太明白, 我理解力有问题,对于安全性的问题,依然还是很模糊, 我认为的set和get的方法跟_set和_get没有什么区别,调用者调用它们的时候,它们都是按照接口实现者实现的来执行, 调用者是没有办法改写内部的实现,调用者有什么办法对代码造成安全威胁呢? 老师劳烦再指点一下。 还有对于老师说的闭包没有实现问题: 我对闭包的理解是函数返回到外部仍然能够持有对外部函数作用域的访问, 也就是说构造函数执行完后, 依然能够保留_privateStore。而构造函数当中定义的get和set方法,正是在构造函数执行完后,依然能够访问_privateStore, 所以我认为这是闭包原理。
    2020-01-17 13:29:56
好帮手慕星星 2020-01-16 18:59:33

同学你好,问题解答如下:

1、这样效果实现了,但是Student函数中有一个_privateStore对象,初始化了并没有使用哦,可以将属性添加在这个对象中,获取的时候后面跟着调用不需要传参,参考

http://img1.sycdn.imooc.com//climg/5e204149092e0d0b05320424.jpg

http://img1.sycdn.imooc.com//climg/5e20415009ca43e704770226.jpg

http://img1.sycdn.imooc.com//climg/5e20415509b062aa04720085.jpg

2、这样是为了信息的安全性。set和get是对外的接口,_set和_get是内部私有的,对数据的操作在私有函数中进行,构造函数中定义一个对象privateStore,函数内部的变量无法在外部访问,也不会被实例化对象继承。所以通过privateStore[name]给对象添加的属性,外部也自然访问不到,保障了信息的安全性。当我们想要让外部访问的时候,就通过return把信息返回。

如果我的回答帮助到了你,欢迎采纳,祝学习愉快~

  • 提问者 慕移动3569406 #1
    嗯嗯, 不好意思, 我代码打得太仓促了.. 表达也有问题。 function Student(){ var _privateStore = {}; this.set = function(name, value){ return _privateStore[name] = value; } this.get = function(name, value){ return _privateStore[name]; } } 我其实疑惑的是在这个_get和_set这两个方法实现的必要性,感觉题目的用意就是实现对于privateStore的私有化,而上面这样写的代码一样能够实现私有化,这个get和set一样能够对内部的私有变量进行操作, 所以看上去_set和_get好像没有作用。 还有老师说的保障信息安全性是什么意思? JS所有的代码不是控制台可以直接查看的嘛? 请老师举例说明一下。
    2020-01-16 19:30:54
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
2.组件化网页开发
  • 参与学习           人
  • 提交作业       1121    份
  • 解答问题       14456    个

本阶段在运用JS实现动态网页开发的基础上,带你深入理解企业开发核心思想,完成一个企业级网页的开发,体验前端工程师的成就感。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师