関数の外部から関数の内部の変数にアクセスするために、クロージャメソッドをよく使用します
基本的な変数タイプにアクセスする
基本的なデータ変数を保護して、直接アクセスできないようにします(読み取り、書き込み)
function operateBaseVariable(){
let a = 10
function getA() {
return a
}
function setA(any){
a = any
}
return {
getA,
setA,
}
}
let opertaeBase = operateBaseVariable()//这是一个对象,对象里面包含两个函数
//获取a的值
opertaeBase.getA()
//设置a的值
opertaeBase.setA('a 被重新设置了')
これは機密データのカプセル化です。a。カプセル化の原則の1つは、内部実装メソッドをできるだけ公開しないことです。データaはここで保護されていますが、操作方法を公開しているため、次の点を改善できます。
function operateBaseVariable(){
let a = 10
function getA() {
return a
}
function setA(any){
a = any
}
return {
getBaseA: getA,
setBaseA: setA,
}
}
let opertaeBase = operateBaseVariable()//这是一个对象,对象里面包含两个函数
//获取a的值
opertaeBase.getBaseA()
//设置a的值
opertaeBase.setBaseA('a 被重新设置了')
ここで、データaを操作してアクセスしたい場合は、getBaseA()とsetBaseA()しか使用できません。そうすると、他の開発者は内部で読み書きする方法を知りませんが、これら2つを介して実行できることだけを知っています。メソッド。操作
参照データ型(配列)にアクセスする
配列を保護する方法は?コードに直接移動します
function operateComplexVariable(){
let arr = [1,2,3]
function getArr() {
let newArr = [...arr] //深拷贝
return newArr
}
function pushArr(any){
arr.push(any)
}
return {
getComplexArr: getArr,
pushComplexArr: pushArr,
}
}
let opertaeComplex = operateComplexVariable()//这是一个对象,对象里面包含两个函数
//获取arr的值
opertaeBase.getComplexArr()
//设置a的值
opertaeBase.pushComplexArr('arr push 的数据')
参照データ型(オブジェクト)にアクセスする
function obj() {
let mySymbol = Symbol() /* es6 出现的新的基本数据类型,我只是想要使用一下 */
let obj = {
name: '张三',
age: 18,
sex: '男',
[mySymbol]: 'symbol数据'
}
function getObj(){
let newobj = {
}
Object.assign(newobj,obj)
return newobj
}
function setObj(setObj){
//setObj应该是个对象
//Object.assign(obj,setObj)
//对象只有一级属性时,用这个方法深拷贝没有问题
//在对象的二级属性为引用类型时,这个方法就是浅拷贝二级属性了了
//更改
return JSON.parse(JSON.stringify(obj ))
}
return {
getObject: getObj,
setObject: setObj,
}
}
let objOperate = obj()
objOperate.getObject()
objOperate.setObject({
add: '新增数据'})
console.log(objOperate.getObject())
これは基本型データとは異なり、取得した関数でarr(アドレス)が直接公開されている場合は、まったく保護されません。これは、参照型がメモリに格納されているためです。
基本データストレージはスタックに直接格納され、誤操作は保護されたaの値に影響しません。
参照データ型はヒープに格納されます。保護されたarrが直接返される場合、誤操作はarrの値を変更します。 、これが操作の場合は、ディープコピーを作成します。外部の誤操作があったとしても、変更されたのはarrの代替newArrであるため、保護されたarrには影響しません。
Object.assign
レプリケーションの原則、内部実装は次のようになります
//由上面的错误的思考
Object.assign = function(newObj,oldObj) {
for(let key in oldObj) {
newObj[key]=oldObj[key]
}
return newObj
}
個人的な意見ですが、始めてすぐに、間違いがあれば訂正してください。