จุดประสงค์ของวิธีการต้นแบบคืออะไร?


10

ฉันกำลังอ่านผ่านJavascript: ส่วนดีและต่อสู้เพื่อให้ได้หัวของฉันรอบส่วนที่เกี่ยวกับต้นแบบ

หลังจาก google เล็กน้อยฉันก็สรุปว่ามันคือการเพิ่มคุณสมบัติให้กับวัตถุหลังจากการประกาศวัตถุ

การใช้สคริปต์นี้ gleamed จาก w3schools ผมสังเกตเห็นว่าการถอดสายเพิ่มคุณสมบัติต้นแบบมีไม่มีผลกระทบ ดังนั้นประเด็นคืออะไร?


//Prototyping

function employee(name,jobtitle,born)
{
this.name=name;
this.jobtitle=jobtitle;
this.born=born;
}

var fred=new employee("Fred Flintstone","Caveman",1970);
employee.prototype.salary=null; //  <---  try removing this line
fred.salary=20000;

document.write (fred.salary);


4
@Raynos พูดได้ดี แต่ขอแนะนำให้เปลี่ยนใหม่เช่นเอกสาร MDN: developer.mozilla.org/en/JavaScript
StuperUser

คำตอบ:


13

นั่นไม่ใช่วิธีการทำงานของต้นแบบ ต้นแบบถูกใช้ในห่วงโซ่ต้นแบบ

เมื่อใดก็ตามที่คุณพยายามรับคุณสมบัติบนวัตถุมันจะตรวจสอบวัตถุสำหรับชื่อคุณสมบัตินั้น หากไม่มีอยู่มันจะดูในต้นแบบ

ตัวอย่าง:

var o = {
  "foo": "bar",
  "method": function() { ... }
};

var o2 = Object.create(o);
var o3 = Object.create(o);

console.log(o2.hasOwnProperty("foo")); // false
console.log(o2.foo); // "bar"
console.log(o2.__proto__ === o); // true
o.baz = "foobar";
console.log(o2.baz); // "foobar"

ดังนั้นจุดของต้นแบบคือการใช้รหัสซ้ำและการสืบทอด


ตกลงดังนั้นฉันจะได้รับตอนนี้ แต่ผมพยายามที่จะเพิ่มคุณสมบัติแบบไดนามิกและมันจะบอกฉันprototype is undefined---o.prototype.newProp = "mutts nuts";
Mild Fuzz

3
@MildFuzz oเป็นวัตถุ .prototypeทรัพย์สินที่ใช้ในฟังก์ชั่นไม่สนใจมัน ทำo.newProp = "mutts nuts"
Raynos

7

เมื่อใดที่คุณทำfred.salary=20000คุณได้เพิ่มคุณสมบัติเงินเดือนเพียงเพื่อเฟร็ด เมื่อใช้งานต้นแบบพนักงานทุกคนที่คุณสร้างจากนั้นจะมีคุณสมบัติเงินเดือน

สมมติว่าคุณมีพนักงาน 100 คนและคุณต้องการเพิ่มแอตทริบิวต์เงินเดือนให้กับพวกเขาทั้งหมด คุณสามารถทำได้ด้วยตนเองวนซ้ำพนักงานแต่ละคนและเพิ่ม หรือคุณสามารถใช้เครื่องต้นแบบและตั้งค่าได้ถ้าต้องการทั้งหมด

ต้นแบบมีประโยชน์เมื่อคุณต้องการใช้งานกับสิ่งที่มีอยู่แล้ว สมมติว่าคุณต้องการเพิ่มวิธีการที่กำหนดเองในอาร์เรย์ คุณจะทำสิ่งที่ชอบ:

Array.prototype.my_custom_method = function() {...}

จากนั้นเป็นต้นไปอาร์เรย์ทั้งหมดที่คุณจะสร้างจะมีวิธีการนั้นพร้อมใช้งาน


3
ฉันประหลาดใจที่ไม่มีใครพูดถึงว่านี่ถูกออกแบบมาเพื่อให้การใช้งานหน่วยความจำลดลง หากคุณต้องการใช้วัตถุที่ซับซ้อนที่มีรหัสจำนวนมากคุณไม่ต้องการให้รหัสซ้ำในทุก ๆ ครั้งของวัตถุ เห็นได้ชัดว่าคุณสมบัติของข้อมูลมีแนวโน้มที่จะแตกต่างกันไปในแต่ละอินสแตนซ์ แต่โดยปกติคุณต้องการเพียงหนึ่งสำเนาของรหัสดังนั้นคุณจึงใส่ไว้ในต้นแบบ
Dominic Cronin

1
IMO นี่เป็นคำตอบที่ดีที่สุด
The Muffin Man

5

คุณอาจต้องการที่จะดูที่บทความนี้

ภาษาที่ใช้ต้นแบบมีแนวคิดของวัตถุต้นแบบซึ่งเป็นวัตถุที่ใช้เป็นแม่แบบที่จะได้รับคุณสมบัติเริ่มต้นสำหรับวัตถุใหม่ วัตถุใด ๆ สามารถระบุคุณสมบัติของตัวเองได้ไม่ว่าคุณจะสร้างมันหรือในเวลาทำงาน นอกจากนี้วัตถุใด ๆ สามารถเชื่อมโยงเป็นต้นแบบสำหรับวัตถุอื่นทำให้วัตถุที่สองใช้คุณสมบัติของวัตถุแรกร่วมกัน

หากคุณเพิ่มคุณสมบัติให้กับวัตถุที่ใช้เป็นต้นแบบสำหรับชุดของวัตถุวัตถุที่เป็นต้นแบบก็จะได้รับคุณสมบัติใหม่

นั่นเป็นหนึ่งในข้อได้เปรียบหลักของภาษาที่ใช้ต้นแบบมากกว่าภาษาที่ใช้ในห้องเรียน

นอกจากนี้ยังง่ายที่จะได้รับมรดก OO แบบคลาสสิกด้วย JS หากคุณต้องการ แต่ก็มักจะยากที่จะได้รับต้นแบบต้นแบบสำหรับภาษาที่ไม่ได้ใช้งานโดยค่าเริ่มต้น


3
+1 สำหรับบทความเกี่ยวกับภาษาที่อิงกับคลาสและต้นแบบ
adivasile
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.