หากต้องการขยายคำตอบของ @ loganfsmyth:
ข้อมูลส่วนตัวอย่างแท้จริงใน JavaScript เท่านั้นยังคงเป็นตัวแปรที่กำหนดขอบเขต คุณไม่สามารถมีคุณสมบัติส่วนตัวในแง่ของการเข้าถึงคุณสมบัติภายในเช่นเดียวกับคุณสมบัติสาธารณะ แต่คุณสามารถใช้ตัวแปรที่กำหนดขอบเขตเพื่อจัดเก็บข้อมูลส่วนตัว
ตัวแปรที่กำหนดขอบเขต
วิธีการที่นี่คือการใช้ขอบเขตของฟังก์ชั่นคอนสตรัคซึ่งเป็นส่วนตัวในการจัดเก็บข้อมูลส่วนตัว สำหรับวิธีในการเข้าถึงข้อมูลส่วนตัวนี้พวกเขาจะต้องสร้างขึ้นภายในตัวสร้างเช่นกันซึ่งหมายความว่าคุณกำลังสร้างมันขึ้นมาใหม่ทุกครั้ง นี่คือประสิทธิภาพและการลงโทษหน่วยความจำ แต่บางคนเชื่อว่าการลงโทษนั้นเป็นที่ยอมรับ บทลงโทษสามารถหลีกเลี่ยงได้สำหรับวิธีการที่ไม่จำเป็นต้องเข้าถึงข้อมูลส่วนตัวโดยการเพิ่มลงในต้นแบบตามปกติ
ตัวอย่าง:
function Person(name) {
let age = 20; // this is private
this.name = name; // this is public
this.greet = function () {
// here we can access both name and age
console.log(`name: ${this.name}, age: ${age}`);
};
}
let joe = new Person('Joe');
joe.greet();
// here we can access name but not age
แผนที่อ่อนแอ
WeakMap สามารถใช้เพื่อหลีกเลี่ยงการปฏิบัติก่อนหน้านี้ของวิธีการและการลงโทษหน่วยความจำ WeakMaps เชื่อมโยงข้อมูลกับวัตถุ (ที่นี่อินสแตนซ์) ในลักษณะที่สามารถเข้าถึงได้โดยใช้ WeakMap นั้น ดังนั้นเราจะใช้วิธีการกำหนดขอบเขตตัวแปรในการสร้าง WeakMap ส่วนตัวแล้วใช้ WeakMap this
ว่าเพื่อดึงข้อมูลส่วนตัวที่เกี่ยวข้องกับ นี่เร็วกว่าวิธีตัวแปรที่กำหนดขอบเขตเนื่องจากอินสแตนซ์ทั้งหมดของคุณสามารถแบ่งปัน WeakMap เดียวได้ดังนั้นคุณไม่จำเป็นต้องสร้างวิธีการใหม่เพื่อให้เข้าถึง WeakMaps ของพวกเขาเอง
ตัวอย่าง:
let Person = (function () {
let privateProps = new WeakMap();
class Person {
constructor(name) {
this.name = name; // this is public
privateProps.set(this, {age: 20}); // this is private
}
greet() {
// Here we can access both name and age
console.log(`name: ${this.name}, age: ${privateProps.get(this).age}`);
}
}
return Person;
})();
let joe = new Person('Joe');
joe.greet();
// here we can access joe's name but not age
ตัวอย่างนี้ใช้วัตถุเพื่อใช้ WeakMap เดียวสำหรับคุณสมบัติส่วนตัวหลายรายการ คุณยังสามารถใช้ WeakMaps หลายและใช้พวกเขาชอบหรือเขียนกระดาษห่อขนาดเล็กและใช้วิธีอื่นเช่นage.set(this, 20)
privateProps.set(this, 'age', 0)
ความเป็นส่วนตัวของวิธีการนี้อาจถูกละเมิดโดยการเข้าไปยุ่งเกี่ยวกับWeakMap
วัตถุระดับโลก ที่กล่าวว่า JavaScript ทั้งหมดสามารถใช้งานได้ รหัสของเราสร้างขึ้นจากสมมติฐานที่ว่าสิ่งนี้ไม่ได้เกิดขึ้น
(วิธีนี้สามารถทำได้ด้วยMap
แต่WeakMap
จะดีกว่าเพราะMap
จะสร้างการรั่วไหลของหน่วยความจำเว้นแต่คุณจะระมัดระวังและเพื่อจุดประสงค์นี้ทั้งสองจะไม่แตกต่างกัน)
ครึ่งคำตอบ: สัญลักษณ์ที่กำหนดขอบเขต
Symbol เป็นประเภทของค่าดั้งเดิมที่สามารถใช้เป็นชื่อคุณสมบัติ this[mySymbol]
คุณสามารถใช้วิธีการกำหนดขอบเขตตัวแปรในการสร้างสัญลักษณ์ส่วนตัวแล้วเก็บข้อมูลส่วนตัว
ความเป็นส่วนตัวของวิธีนี้อาจถูกละเมิดโดยใช้Object.getOwnPropertySymbols
แต่ค่อนข้างจะน่าอึดอัดใจที่จะทำ
ตัวอย่าง:
let Person = (function () {
let ageKey = Symbol();
class Person {
constructor(name) {
this.name = name; // this is public
this[ageKey] = 20; // this is intended to be private
}
greet() {
// Here we can access both name and age
console.log(`name: ${this.name}, age: ${this[ageKey]}`);
}
}
return Person;
})();
let joe = new Person('Joe');
joe.greet();
// Here we can access joe's name and, with a little effort, age. ageKey is
// not in scope, but we can obtain it by listing all Symbol properties on
// joe with `Object.getOwnPropertySymbols(joe)`.
ครึ่งคำตอบ: ขีดล่าง
เริ่มต้นเก่าเพียงใช้ทรัพย์สินสาธารณะที่มีคำนำหน้าขีดล่าง แม้ว่าจะไม่ใช่ทรัพย์สินส่วนตัว แต่อย่างใดข้อตกลงนี้แพร่หลายมากพอที่จะสื่อสารได้ดีว่าผู้อ่านควรปฏิบัติต่ออสังหาริมทรัพย์ในฐานะส่วนตัวซึ่งมักจะทำให้งานสำเร็จ เพื่อแลกกับการหมดอายุนี้เราได้รับแนวทางที่ง่ายต่อการอ่านง่ายกว่าในการพิมพ์และเร็วขึ้น
ตัวอย่าง:
class Person {
constructor(name) {
this.name = name; // this is public
this._age = 20; // this is intended to be private
}
greet() {
// Here we can access both name and age
console.log(`name: ${this.name}, age: ${this._age}`);
}
}
let joe = new Person('Joe');
joe.greet();
// Here we can access both joe's name and age. But we know we aren't
// supposed to access his age, which just might stop us.
ข้อสรุป
ในขณะที่ ES2017 ยังไม่มีวิธีที่สมบูรณ์แบบในการทำคุณสมบัติส่วนตัว วิธีการต่าง ๆ มีข้อดีและข้อเสีย ตัวแปรที่กำหนดขอบเขตเป็นส่วนตัวอย่างแท้จริง WeakMaps ที่กำหนดขอบเขตเป็นแบบส่วนตัวและมีประโยชน์มากกว่าตัวแปรที่กำหนดขอบเขต สัญลักษณ์ที่กำหนดขอบเขตนั้นมีความเป็นส่วนตัวและสมเหตุสมผล ขีดล่างมักจะเป็นส่วนตัวมากพอและใช้งานได้ดีมาก