เมื่อเราพูดถึงวัตถุ -มุ่งเน้นเราสามารถนึกถึงชั้นเรียนวัตถุบรรจุภัณฑ์การสืบทอดความหลากหลาย ในหนังสือ "JavaScript Advanced Program Design" (โพสต์ของผู้คนและสื่อสื่อสารโทรคมนาคม, Cao Li, Zhang Xin ชื่อภาษาอังกฤษคือ: JavaScript มืออาชีพสำหรับนักพัฒนาเว็บ) ได้อธิบายไว้ในหนังสือเล่มนี้ ลองมาดูวิธีการต่าง ๆ ที่กำหนดไว้ใน JavaScript
1. วิธีโรงงาน
สร้างคลาสและวัตถุของเราเองใน JavaScript เราควรจะต้องควบคุม
คัดลอกรหัสรหัสดังนี้:
<script type = "text/javascript">
//คำนิยาม
var ocar = วัตถุใหม่ ();
ocar.color = "สีแดง";
ocar.doors = 4;
ocar.showColor = function () {
การแจ้งเตือน (this.color);
-
// เรียก
ocar.showcolor ();
</script>
เราใช้วัตถุ OCAR ได้ง่าย แต่เราสร้างอินสแตนซ์รถยนต์หลายรายการ เราสามารถใช้ฟังก์ชั่นเพื่อห่อหุ้มรหัสด้านบนเพื่อนำไปใช้:
คัดลอกรหัสรหัสดังนี้:
<script type = "text/javascript">
//คำนิยาม
ฟังก์ชั่น createCar () {
var ocar = วัตถุใหม่ ();
ocar.color = "สีแดง";
ocar.doors = 4;
ocar.showColor = function () {
การแจ้งเตือน (this.color);
-
คืน ocar;
-
// เรียก
var ocar1 = createCar ();
var ocar2 = createCar ();
ocar1.color = "ดำ";
ocar1.showcolor ();
ocar2.showcolor ();
</script>
โดยวิธีการคุณลักษณะการเป็นสมาชิกเริ่มต้นของวัตถุ JavaScript เป็นสาธารณะ ด้วยวิธีนี้เราเรียกมันว่าวิธีการโรงงานและเราได้สร้างโรงงานที่สามารถสร้างและส่งคืนวัตถุประเภทเฉพาะ
นี่เป็นสิ่งที่น่าสนใจเล็กน้อย แต่ในวัตถุที่เน้นวัตถุวิธีการสร้างวัตถุคือ:
รถยนต์รถยนต์ = รถใหม่ ();
การใช้คำหลักใหม่ได้รับการหยั่งรากลึกในหัวใจของผู้คนดังนั้นเราจึงใช้วิธีการข้างต้นเพื่อกำหนดมัน . ลองดูคำจำกัดความของฟอร์มของตัวสร้าง
2. ตัวสร้าง
วิธีนี้ดูเหมือนฟังก์ชั่นจากโรงงาน ประสิทธิภาพเฉพาะมีดังนี้:
คัดลอกรหัสรหัสดังนี้:
<script type = "text/javascript">
//คำนิยาม
Function Car (สี, ประตู) {
this.color = color;
this.doors = ประตู;
this.showColor = function () {
การแจ้งเตือน (this.color);
-
-
// เรียก
var car1 = รถใหม่ ("สีแดง", 4);
var car2 = รถใหม่ ("สีน้ำเงิน", 4);
car1.showcolor ();
car2.showcolor ();
</script>
มันดูชัดเจนมีความแตกต่าง รู้สึกน่าสนใจเล็กน้อย สร้างวัตถุภายในฟังก์ชั่นการสร้างโดยใช้คำหลักนี้และรู้สึกดีมากที่จะสร้างวัตถุโดยใช้สัญลักษณ์การคำนวณใหม่ แต่ยังมีปัญหาบางอย่าง: ทุกครั้งที่มีการสร้างวัตถุใหม่คุณลักษณะทั้งหมดรวมถึงการสร้างฟังก์ชั่นนั่นคือการบอกว่าวัตถุหลายชิ้นมีความเป็นอิสระอย่างสมบูรณ์ Object Object และ Car2 เป็นทั้งคู่ นี่คือข้อได้เปรียบของรูปแบบดั้งเดิม
3. ต้นแบบ
การใช้แอตทริบิวต์ต้นแบบของวัตถุคุณสามารถเห็นต้นแบบที่วัตถุใหม่ขึ้นอยู่กับ วิธีนี้มีดังนี้:
คัดลอกรหัสรหัสดังนี้:
<script type = "text/javascript">
//คำนิยาม
Fuinction Car () {
-
car.prototype.color = "สีแดง";
car.prototype.doors = 4;
car.prototype.drivers = new Array ("Tom", "Jerry");
car.prototype.showColor = function () {
การแจ้งเตือน (this.color);
-
// เรียก:
var car1 = รถใหม่ ();
var car2 = รถใหม่ ();
car1.showcolor ();
car2.showcolor ();
การแจ้งเตือน (car1.drivers);
car1.drivers.push ("Stephen");
การแจ้งเตือน (car1.drivers);
การแจ้งเตือน (car2.drivers);
// คุณสามารถใช้ JSON เพื่อทำให้คำจำกัดความของต้นแบบง่ายขึ้น:
car.prototype =
-
สี: "สีแดง",
ประตู: 4,
ไดรเวอร์: ["Tom", "Jerry", 'Safdad'],
showcolor: function () {
การแจ้งเตือน (this.color);
-
-
</script>
ก่อนอื่นตัวสร้างของรหัสนี้ไม่มีรหัสแล้วเพิ่มแอตทริบิวต์ของวัตถุเพื่อกำหนดแอตทริบิวต์ของวัตถุรถยนต์ผ่านแอตทริบิวต์ต้นแบบของวัตถุ วิธีนี้ดีมาก แต่ปัญหาคือวัตถุของรถชี้ไปที่ตัวชี้อาเรย์ Car2 ในเวลาเดียวกันก็ไม่อนุญาตให้ใช้
ในขณะเดียวกันปัญหาก็ปรากฏในต้นแบบที่ไม่สามารถนำพารามิเตอร์การเริ่มต้นใด ๆ ซึ่งทำให้ตัวสร้างไม่สามารถเริ่มต้นได้ตามปกติ สิ่งนี้ต้องใช้วิธีอื่นในการแก้ปัญหานั่นคือโหมดคอนสตรัคเตอร์/ต้นแบบผสม
4. โหมดตัวสร้าง/ต้นแบบผสม
การรวมกันของตัวสร้างและต้นแบบนั้นสะดวกมากในการกำหนดชั้นเรียน
คัดลอกรหัสรหัสดังนี้:
<script type = "text/javascript">
//คำนิยาม
Function Car (สีประตู)
-
this.color = color;
this.doors = ประตู;
this.divers = new Array ("Tom", "Jerry");
-
car.prototype.showColor = function () {
การแจ้งเตือน (this.color);
-
// เรียก:
var car1 = รถใหม่ ('สีแดง', 4);
var car2 = รถใหม่ ('สีน้ำเงิน', 4);
car1.showcolor ();
car2.showcolor ();
การแจ้งเตือน (car1.drivers);
car1.drivers.push ("Stephen");
การแจ้งเตือน (car1.drivers);
การแจ้งเตือน (car2.drivers);
การแจ้งเตือน (Car1 Instanceof Car);
</script>
วิธีนี้คือการกำหนดแอตทริบิวต์ภายในและใช้ต้นแบบเพื่อกำหนดภายนอก ปัญหาของการแก้วิธีที่สาม
วิธีนี้ควรเป็นมิตรมาก แต่เมื่อเทียบกับไวยากรณ์ของ Java ควรมีความไม่ลงรอยกันและรู้สึกยุ่งมากขึ้นสำหรับ C ++ เราไม่รู้สึกลำบาก สำหรับบุคลากร R&D J2EE วิธีนี้มักจะอึดอัดใจเสมอ รู้สึกว่ามันไม่ใช่บรรจุภัณฑ์ที่เป็นมิตร ถือว่าเป็นปัญหามากขึ้น นั่นคือต้นแบบไดนามิก
5. ต้นแบบไดนามิก
สำหรับนักพัฒนาที่คุ้นเคยกับการใช้ภาษาอื่น ๆ การใช้ตัวสร้าง/ต้นแบบแบบผสมนั้นไม่ได้กลมกลืน ท้ายที่สุดเมื่อกำหนดหมวดหมู่ภาษาที่มุ่งเน้นวัตถุส่วนใหญ่จะถูกบรรจุด้วยสายตาบนแอตทริบิวต์และวิธีการ พิจารณาคลาส C#ต่อไปนี้:
คัดลอกรหัสรหัสดังนี้:
คลาสรถชั้นเรียน // ชั้นเรียน
-
สีสตริงสาธารณะ = "สีแดง";
ประตูสาธารณะสาธารณะ = 4;
สาธารณะ int mpg = 23;
รถสาธารณะ (สีสตริง, ประตู int, int mpg) // constructor
-
this.color = color;
this.doors = ประตู;
this.mpg = mpg;
-
ช่องว่างสาธารณะ Showcolor () // Medhod
-
Console.WriteLine (this.color);
-
-
C#บรรจุคุณลักษณะและวิธีการทั้งหมดของคลาสรถได้ดีดังนั้นเมื่อคุณเห็นรหัสนี้คุณจะรู้ว่าฟังก์ชั่นใดที่จะบรรลุและกำหนดข้อมูลของวัตถุ ผู้ที่วิพากษ์วิจารณ์ตัวสร้าง/ต้นแบบของคอนสตรัคเตอร์ผสมเชื่อว่าวิธีการค้นหาคุณลักษณะในหน่วยความจำของคอนสตรัคเตอร์และวิธีการค้นหาวิธีการนอกนั้นไม่สมเหตุสมผล ดังนั้นพวกเขาจึงออกแบบต้นแบบแบบไดนามิกเพื่อให้สไตล์การเข้ารหัสที่เป็นมิตรมากขึ้น
แนวคิดพื้นฐานของวิธีการต้นแบบแบบไดนามิกนั้นเหมือนกับตัวสร้าง/ต้นแบบของโครงสร้างผสมนั่นคือกำหนดคุณลักษณะที่ไม่ทำงานในตัวสร้างและแอตทริบิวต์ฟังก์ชั่นถูกกำหนดโดยใช้แอตทริบิวต์ต้นแบบ ความแตกต่างเพียงอย่างเดียวคือตำแหน่งของวิธีวัตถุ ต่อไปนี้คือคลาสรถที่เขียนใหม่โดย Dynamic Prototype:
คัดลอกรหัสรหัสดังนี้:
<script type = "text/javascript">
//คำนิยาม
Fuinction Car () {
this.color = "สีแดง";
this.doors = 4;
this.divers = new Array ("Tom", "Jerry");
ifof car._initialized == "undefined") {{
car.prototype.showColor = function () {
การแจ้งเตือน (this.color);
-
-
-
// คำจำกัดความล่าสุด
car._initialized = true;
-
</script>
จนกว่าจะตรวจสอบ typeof car._initialized เทียบเท่าเท่ากับ "ไม่ได้กำหนด" ตัวสร้างนี้ไม่เปลี่ยนแปลง บรรทัดของรหัสนี้เป็นส่วนที่สำคัญที่สุดของวิธีการต้นแบบแบบไดนามิก หากไม่ได้กำหนดค่านี้ตัวสร้างจะยังคงกำหนดวิธีการวัตถุโดยต้นแบบจากนั้นตั้งค่า car._initialized เป็นจริง หากค่านี้ถูกกำหนด (เมื่อค่าของมันเป็นจริงค่าของ typeof คือบูลีน) ดังนั้นวิธีนี้จะไม่ถูกสร้างขึ้น ในระยะสั้นวิธีนี้ใช้โลโก้ (_initialized) เพื่อตรวจสอบว่าได้ให้วิธีการใด ๆ กับต้นแบบหรือไม่ วิธีนี้ถูกสร้างขึ้นและมอบหมายเพียงครั้งเดียว
6 วิธีโรงงานไฮบริด
วิธีนี้มักจะเป็นวิธีการเปลี่ยนวิธีเมื่อไม่สามารถใช้วิธีก่อนหน้าได้ จุดประสงค์คือการสร้างตัวสร้างปลอมและส่งคืนตัวอย่างใหม่ของวัตถุอื่นเท่านั้น รหัสนี้ดูเหมือนจะคล้ายกับฟังก์ชั่นโรงงานมาก:
คัดลอกรหัสรหัสดังนี้:
Fuinction Car () {
var ompcar = วัตถุใหม่ ();
ionmpcar.color = "สีแดง";
ionmpcar.doors = 4;
ionmpcar.mpg = 23;
ionmpcar.showColor = function () {
การแจ้งเตือน (this.color);
-
กลับ otempcar;
-
แตกต่างจากวิธีคลาสสิกวิธีนี้ใช้ตัวดำเนินการใหม่เพื่อให้ดูเหมือนฟังก์ชั่นโครงสร้างจริง:
var ocar = ใหม่ Car ();
เนื่องจากตัวดำเนินการใหม่ถูกเรียกภายในตัวสร้างรถยนต์ () ตัวสร้างใหม่ผู้ให้บริการรายที่สองจะถูกละเว้น (อยู่นอกคอนสตรัคเตอร์) วัตถุที่สร้างขึ้นในตัวสร้างจะถูกส่งกลับไปยังตัวแปร var วิธีนี้มีปัญหาเช่นเดียวกับวิธีการคลาสสิกของวิธีวัตถุ แนะนำอย่างยิ่ง: เว้นแต่คุณจะต้อง (ดูบทที่ 15) คุณยังคงหลีกเลี่ยงวิธีนี้
สรุป: (ใช้วิธีใด)
ในปัจจุบันสิ่งที่ใช้กันอย่างแพร่หลายที่สุดคือตัวสร้าง/ต้นแบบผสม นอกจากนี้ต้นแบบแบบไดนามิกยังเป็นที่นิยมมากและเทียบเท่ากับฟังก์ชันการทำงาน/ต้นแบบในการทำงาน คุณสามารถใช้วิธีการทั้งสองนี้ได้ อย่างไรก็ตามอย่าใช้ตัวสร้างคลาสสิกหรือต้นแบบเพราะสิ่งนี้จะแนะนำรหัสให้กับปัญหา
คัดลอกรหัสรหัสดังนี้:
// ps
// คลาสคงที่ (1: ฟังก์ชั่น)
Varcollection = new function () {
var _carcollection = new Array ();
this.add = function (objcar) {
การแจ้งเตือน ('เพิ่ม');
-
this.get = function (carid) {
การแจ้งเตือน ('Get');
-
-
// คลาสคงที่ (2: JSON)
var car = {
สี: 'สีแดง',
ประตู: 4,
showcolor: function () {Alert (this.color);}
-
car.showcolor ();