Getters และ Setters ใน JavaScript
ภาพรวม
Getters และ setters ใน JavaScript ถูกนำมาใช้สำหรับการกำหนดคุณสมบัติคำนวณหรือaccessors คุณสมบัติที่คำนวณคือคุณสมบัติที่ใช้ฟังก์ชันเพื่อรับหรือตั้งค่าวัตถุ ทฤษฎีพื้นฐานกำลังทำสิ่งนี้:
var user = { };
user.phone = '+1 (123) 456-7890';
console.log( user.areaCode );
console.log( user.area );
สิ่งนี้มีประโยชน์สำหรับการทำสิ่งต่างๆเบื้องหลังโดยอัตโนมัติเมื่อมีการเข้าถึงคุณสมบัติเช่นการรักษาตัวเลขให้อยู่ในช่วงการจัดรูปแบบสตริงการทริกเกอร์เหตุการณ์ที่มีการเปลี่ยนแปลงค่าการอัปเดตข้อมูลเชิงสัมพันธ์การให้การเข้าถึงคุณสมบัติส่วนตัวและอื่น ๆ
ตัวอย่างด้านล่างแสดงไวยากรณ์พื้นฐานแม้ว่าจะรับและตั้งค่าวัตถุภายในโดยไม่ต้องทำอะไรเป็นพิเศษ ในกรณีของความเป็นจริงคุณจะแก้ไขค่าอินพุตและ / หรือเอาต์พุตให้เหมาะกับความต้องการของคุณดังที่ระบุไว้ข้างต้น
รับ / ตั้งค่าคำหลัก
ECMAScript 5 รองรับget
และset
คำสำคัญสำหรับการกำหนดคุณสมบัติที่คำนวณ ทำงานร่วมกับเบราว์เซอร์ที่ทันสมัยทั้งหมดยกเว้น IE 8 และต่ำกว่า
var foo = {
bar : 123,
get bar(){ return bar; },
set bar( value ){ this.bar = value; }
};
foo.bar = 456;
var gaz = foo.bar;
ผู้รับและ Setters ที่กำหนดเอง
get
และset
ไม่ใช่คำสงวนดังนั้นจึงสามารถใช้งานได้มากเกินไปในการสร้างฟังก์ชันคุณสมบัติที่คำนวณจากเบราว์เซอร์ที่กำหนดเองของคุณเอง สิ่งนี้จะทำงานในเบราว์เซอร์ใดก็ได้
var foo = {
_bar : 123,
get : function( name ){ return this[ '_' + name ]; },
set : function( name, value ){ this[ '_' + name ] = value; }
};
foo.set( 'bar', 456 );
var gaz = foo.get( 'bar' );
หรือเพื่อวิธีการที่กะทัดรัดยิ่งขึ้นอาจใช้ฟังก์ชันเดียว
var foo = {
_bar : 123,
value : function( name /*, value */ ){
if( arguments.length < 2 ){ return this[ '_' + name ]; }
this[ '_' + name ] = value;
}
};
foo.value( 'bar', 456 );
var gaz = foo.value( 'bar' );
หลีกเลี่ยงการทำสิ่งนี้ซึ่งอาจทำให้โค้ดขยายตัวได้
var foo = {
_a : 123, _b : 456, _c : 789,
getA : function(){ return this._a; },
getB : ..., getC : ..., setA : ..., setB : ..., setC : ...
};
สำหรับตัวอย่างข้างต้นชื่อคุณสมบัติภายในจะมีการขีดล่างเพื่อไม่ให้ผู้ใช้เพียงแค่ทำfoo.bar
เทียบกับfoo.get( 'bar' )
และได้รับค่าที่ "ไม่ได้ปรุง" คุณสามารถใช้โค้ดเงื่อนไขเพื่อทำสิ่งต่างๆได้โดยขึ้นอยู่กับชื่อของคุณสมบัติที่เข้าถึง (ผ่านname
พารามิเตอร์)
Object.defineProperty ()
การใช้Object.defineProperty()
เป็นอีกวิธีหนึ่งในการเพิ่ม getters และ setters และสามารถใช้กับอ็อบเจกต์หลังจากกำหนดได้แล้ว นอกจากนี้ยังสามารถใช้เพื่อตั้งค่าพฤติกรรมที่กำหนดและระบุได้ ไวยากรณ์นี้ใช้ได้กับ IE 8 ด้วย แต่น่าเสียดายที่มีเฉพาะวัตถุ DOM เท่านั้น
var foo = { _bar : 123 };
Object.defineProperty( foo, 'bar', {
get : function(){ return this._bar; },
set : function( value ){ this._bar = value; }
} );
foo.bar = 456;
var gaz = foo.bar;
__defineGetter __ ()
สุดท้าย__defineGetter__()
เป็นอีกทางเลือกหนึ่ง เลิกใช้แล้ว แต่ยังคงใช้กันอย่างแพร่หลายในเว็บจึงไม่น่าจะหายไปในเร็ว ๆ นี้ ใช้งานได้กับทุกเบราว์เซอร์ยกเว้น IE 10 และต่ำกว่า แม้ว่าตัวเลือกอื่น ๆ จะทำงานได้ดีบนที่ไม่ใช่ IE ด้วยดังนั้นตัวเลือกนี้จึงไม่มีประโยชน์
var foo = { _bar : 123; }
foo.__defineGetter__( 'bar', function(){ return this._bar; } );
foo.__defineSetter__( 'bar', function( value ){ this._bar = value; } );
สิ่งที่น่าสังเกตก็คือในตัวอย่างหลัง ๆ ชื่อภายในจะต้องแตกต่างจากชื่อผู้เข้าถึงเพื่อหลีกเลี่ยงการเรียกซ้ำ (เช่นการfoo.bar
โทรfoo.get(bar)
เรียกการfoo.bar
โทรfoo.get(bar)
... )
ดูสิ่งนี้ด้วย
MDN get , set ,
Object.defineProperty () , __defineGetter __ () , __defineSetter __ ()
MSDN
IE8 Getter Support