คำอธิบายโหมดต้นแบบ
หมายเหตุ: ใช้อินสแตนซ์ต้นแบบเพื่อคัดลอกและสร้างวัตถุที่ปรับแต่งได้ใหม่ สำหรับวัตถุที่สร้างขึ้นใหม่คุณไม่จำเป็นต้องรู้กระบวนการเฉพาะในการสร้างวัตถุต้นฉบับ
ขั้นตอน: prototype => protoexam ใหม่ => โคลนไปยังวัตถุใหม่;
ใช้รหัสที่เกี่ยวข้อง:
การคัดลอกรหัสมีดังนี้:
ฟังก์ชันต้นแบบ () {
this.name = '';
this.age = '';
this.sex = '';
-
prototype.prototype.userinfo = function () {
ส่งคืน 'ข้อมูลส่วนบุคคลชื่อ:'+this.name+', อายุ:'+this.age+', เพศ:'+this.sex+'<br />';
-
ตอนนี้จำเป็นต้องมีเนื้อหาข้อมูลส่วนบุคคลสองรายการขึ้นไป:
การคัดลอกรหัสมีดังนี้:
var proto = rototype ใหม่ ();
var person1 = object.create (proto);
person1.name = 'Xiao Ming';
person1.sex = 'ชาย';
person1.age = 35;
person1.userinfo ();
-
var person2 = object.create (proto);
person2.name = 'Xiaohua';
person2.sex = 'หญิง';
person2.age = 33;
person2.userinfo ();
ผลตอบแทนเอาต์พุต:
การคัดลอกรหัสมีดังนี้:
ข้อมูลส่วนบุคคลชื่อ: Xiao Ming อายุ: 35, เพศ: ชาย
ข้อมูลส่วนบุคคลชื่อ: Xiaohua อายุ: 33, เพศ: หญิง
โดยทั่วไปโหมดต้นแบบใช้สำหรับโครงสร้างนามธรรมที่ซับซ้อน แต่องค์ประกอบของเนื้อหามีความคล้ายคลึงกันเนื้อหานามธรรมสามารถปรับแต่งได้และการสร้างใหม่นั้นต้องการการแก้ไขเล็กน้อยบนวัตถุการสร้างต้นฉบับเพื่อตอบสนองความต้องการ
Object.create คำแนะนำ
1>. คำจำกัดความ: สร้างวัตถุที่ระบุวัตถุต้นแบบและสามารถมีคุณสมบัติที่กำหนดเองได้
2> Object.create (proto [, properties]); ไม่บังคับใช้เพื่อกำหนดค่าคุณสมบัติของวัตถุใหม่
การคัดลอกรหัสมีดังนี้:
1. Proto: เพื่อสร้างต้นแบบของวัตถุใหม่มันจะต้องเป็นโมฆะ โปรโตนี้มีค่าเฉพาะเมื่อมันถูกสร้างขึ้น [ใหม่] หรือ Object.prototype;
2. คุณสมบัติ: ไม่บังคับโครงสร้าง:
-
Propfield: {
ค่า: 'val' | {} | function () {}
เขียนได้: จริง | เท็จ
enumerable: จริง | เท็จ
สามารถกำหนดค่าได้: จริง | เท็จ
รับ: function () {return 10}
ชุด: ฟังก์ชัน (ค่า) {}
-
-
แอตทริบิวต์ที่กำหนดเองมีคุณสมบัติสี่อย่างต่อไปนี้:
ค่า: ค่าแอตทริบิวต์ที่กำหนดเอง;
เขียนได้: ไม่ว่าจะเป็นค่าของรายการนี้ที่สามารถแก้ไขได้ค่าเริ่มต้นเป็นเท็จและเมื่อเป็นจริงหรือไม่สามารถกำหนด obj.prodfield; มิฉะนั้นอ่านอย่างเดียว
enumerable: enumerable;
สามารถกำหนดค่าได้: กำหนดค่าได้;
นอกจากนี้ยังสามารถรวมถึงการตั้งค่าวิธีการเข้าถึง
ในหมู่พวกเขา [set, get] ไม่สามารถปรากฏในเวลาเดียวกันกับค่าและเขียนได้;
1. สร้างคลาสวัตถุต้นแบบ:
การคัดลอกรหัสมีดังนี้:
ฟังก์ชั่น protoclass () {
this.a = 'Protoclass';
this.c = {};
this.b = function () {
-
-
การสร้างวิธีต้นแบบ:
การคัดลอกรหัสมีดังนี้:
protoclass.prototype.amethod = function () {
//this.a;
//this.b ();
คืนสิ่งนี้;
-
วิธีใช้
1. สร้างวัตถุด้วย protoclass.prototype;
การคัดลอกรหัสมีดังนี้:
var obj1 = object.create (protoclass.prototype, {
foo: {value: 'obj1', เขียนได้: จริง}
-
OBJ1 มีวิธีการต้นแบบโปรโตเทสวิธีการ Amethod;
การคัดลอกรหัสมีดังนี้:
obj1.amethod ();
// วิธีการที่ไม่ได้กำหนดจะสามารถเข้าถึงได้และไม่สามารถเข้าถึงสมาชิกโปรโตคลาสได้
อย่างไรก็ตามวิธีนี้ไม่สามารถเรียกใช้คุณสมบัติสมาชิกของ A, B, C ภายใต้โปรโตสคลาส:
2. ใช้โปรโตคลาสแบบอินสแตนซ์เป็นต้นแบบ:
การคัดลอกรหัสมีดังนี้:
var proto = ใหม่ protoclass ();
var obj2 = object.create (proto, {
foo: {value: 'obj2'}
-
OBJ2 ที่สร้างขึ้นด้วยวิธีนี้มีคุณลักษณะของสมาชิกทั้งหมด A, B, C และวิธีต้นแบบ amethod ของโปรโตโคคลาส; และเพิ่มแอตทริบิวต์ข้อมูลแบบอ่านอย่างเดียว Foo
การคัดลอกรหัสมีดังนี้:
obj2.a; // protoclass
obj2.c: // [วัตถุ]
obj2.b (); -
obj2.amethod (); // protoclass
obj2.foo; // obj2
3. การสืบทอดคลาสย่อย:
การคัดลอกรหัสมีดังนี้:
ฟังก์ชัน subclass () {
-
subclass.prototype = object.create (protoclass.prototype, {
foo: {value: 'subclass'}
-
subclass.prototype.submethod = function () {
ส่งคืนสิ่งนี้ this.foo;
-
วิธีนี้สามารถสืบทอดได้จากเมธอด Amethod ของ Protoclass และดำเนินการ;
การคัดลอกรหัสมีดังนี้:
var func = subclass ใหม่ ();
func.amethod (); // undefined คุณสมบัติของสมาชิกของโปรโตเชอร์ไม่สามารถอ่านได้, a, b, c
func.submethod (); // subclass
ในการเปิดใช้งาน subclass ในการอ่านคุณสมบัติสมาชิกของโปรโตเชอร์คลาสย่อยจะต้องมีการเปลี่ยนแปลง:
การคัดลอกรหัสมีดังนี้:
ฟังก์ชั่น subclass ()
-
Protoclass.call (นี่);
-
// รหัสอื่น ๆ ;
วิธีนี้สามารถรับคุณสมบัติของสมาชิกและวิธีการต้นแบบของโปรโตสคลาส
การคัดลอกรหัสมีดังนี้:
var func = subclass ใหม่ ();
func.amethod (); // protoclass
func.submethod (); // protoclass
อีกวิธีหนึ่งคือการใช้วัตถุโปรโตคลาสแบบอินสแตนซ์เป็นต้นแบบของคลาสย่อย
การคัดลอกรหัสมีดังนี้:
var proto = ใหม่ protoclass ();
ฟังก์ชัน subclass () {
-
subclass.prototype = object.create (proto, {
foo: {value: 'subclass'}
-
ด้วยวิธีนี้หลังจาก subclass เป็นอินสแตนซ์คุณสามารถรับคุณสมบัติโปรโตคลาสทั้งหมดและวิธีการต้นแบบและสร้างแอตทริบิวต์ข้อมูลแบบอ่านอย่างเดียว foo;
การคัดลอกรหัสมีดังนี้:
var func = subclass ใหม่ ();
func.foo; // subclass
func.a; // protoclass
func.b (); -
func.c; //[วัตถุ]
func.amethod (); // protoclass
4. วิธีอื่นในการสร้างการสืบทอดนั้นเหมือนกับ Object.create Protoclass อินสแตนซ์ของต้นแบบ:
การคัดลอกรหัสมีดังนี้:
ฟังก์ชัน subclass () {
this.foo = 'subclass'; // แต่สามารถอ่านและเขียนได้ที่นี่
-
subclass.prototype = new protoclass ();
Object.create คำแนะนำที่เกี่ยวข้อง
Object.create ใช้เพื่อสร้างวัตถุใหม่ เมื่อมันเป็นวัตถุต้นแบบเป็นโมฆะและเอฟเฟกต์ของมันสอดคล้องกับวัตถุใหม่ (); หรือ {};
เมื่อฟังก์ชั่นฟังก์ชั่นเหมือนกับฟังก์ชันใหม่
การคัดลอกรหัสมีดังนี้:
// 1 วัตถุ
var o = {}
// เทียบเท่ากับ
var o2 = object.create ({});
// ตัวสร้างเหมือนกัน;
-
ฟังก์ชั่น func () {
this.a = 'func';
-
func.prototype.method = function () {
คืนสิ่งนี้;
-
var newfunc = new func ();
// เทียบเท่ากับ [เอฟเฟกต์เหมือนกัน]
var newfunc2 = object.create (object.prototype/*function.prototype || function () {}*/, {
A: {value: 'func', เขียนได้: จริง},
วิธี: {value: function () {return this.a;}}
-
แต่ Newfunc และ newFunc2 นั้นแตกต่างกันในการอ้างอิงฟังก์ชั่นเพื่อสร้างวัตถุของพวกเขา
newfunc เป็นฟังก์ชั่น func () {... }, newfunc2 เป็นฟังก์ชันฟังก์ชัน {native}
การคัดลอกรหัสมีดังนี้:
Object.create (Proto [, Propertiesfield])::
Proto ระบุว่าจำเป็นต้องมีค่าและอาจเป็นโมฆะ หากไม่ได้ตั้งค่าไว้จะมีการโยนข้อยกเว้น
Proto ไม่ใช่ Null นั่นคือค่าอินสแตนซ์นั่นคือค่าที่เป็นใหม่ วัตถุส่วนใหญ่ในจาวาสคริปต์มีแอตทริบิวต์ตัวสร้างซึ่งแอตทริบิวต์ระบุว่าฟังก์ชันใดที่วัตถุนั้นผ่านการสร้างอินสแตนซ์
Propertiesfield เป็นตัวเลือกการตั้งค่าคุณสมบัติสมาชิกหรือวิธีการที่อาจจำเป็นสำหรับวัตถุที่สร้างขึ้นใหม่