阿里笔试中的一道题,一眼看上去挺简单,但是仔细想想有挺多地方要注意的。。
原题
请实现一个Person类,且拥有private的成员变量及函数,public的成员变量及函数
提示:参考ts实现
1 | class Person { |
解题过程
第一眼看到这道题的时候马上想到的是最简单的实现,用约定俗成的方法,给私有变量/方法名前缀加下划线:
方法一
1 | const Person = function(name, address) { |
方法二
法一只是一种约定,外部还是能通过_name
取到私有属性。然后想到通过Object.defineProperty
或者Proxy
拦截私有属性的访问,于是写了一个版本:
1 | const Person = function (name, address) { |
这个方法能屏蔽外部对私有属性的访问,但是内部调用必须经过_safeGet
,和题目要求有微妙的区别。。而且某些浏览器不支持Proxy。
方法三
相当于方法二的简单实现,用闭包屏蔽外部访问,还是没解决内部调用的问题:
1 | const Person = function (name, address) { |
方法四
通过原型链屏蔽私有属性的访问,这个解法是符合题目要求的,但是是否是最优解不得而知:
1 | const Person = function (name, address) { |