วิธีใดที่ดีที่สุดสำหรับการสร้างวัตถุใน JavaScript `var` จำเป็นก่อนคุณสมบัติของวัตถุหรือไม่?


177

จนถึงตอนนี้ฉันเห็นสามวิธีในการสร้างวัตถุใน JavaScript วิธีใดที่ดีที่สุดสำหรับการสร้างวัตถุและทำไม

ฉันยังเห็นด้วยว่าในตัวอย่างเหล่านี้ทั้งหมดvarไม่มีการใช้คำหลักก่อนคุณสมบัติ - เพราะเหตุใด ไม่จำเป็นต้องประกาศvarก่อนชื่อของคุณสมบัติตามที่กล่าวถึงคุณสมบัติว่าเป็นตัวแปรหรือไม่?

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

วิธีแรก:

function person(fname, lname, age, eyecolor){
  this.firstname = fname;
  this.lastname = lname;
  this.age = age;
  this.eyecolor = eyecolor;
}

myFather = new person("John", "Doe", 50, "blue");
document.write(myFather.firstname + " is " + myFather.age + " years old.");

วิธีที่สอง:

var Robot = {
  metal: "Titanium",
  killAllHumans: function(){
    alert("Exterminate!");
  }
};

Robot.killAllHumans();

วิธีที่สาม - วัตถุ JavaScript ที่ใช้ไวยากรณ์อาร์เรย์:

var NewObject = {};

NewObject['property1'] = value;
NewObject['property2'] = value;
NewObject['method'] = function(){ /* function code here */ }

2
"var" จะใช้ขึ้นอยู่กับขอบเขตของตัวแปรมันกำหนดระดับโลกหรือไม่ค้นหาและคุณจะเห็นความแตกต่าง
jackJoe

80
หากคุณสร้างหุ่นยนต์ฆ่าตายvarโปรดใช้เสมอ.. ไม่ต้องทำมันทำให้มันเป็นโลก
mykhal

9
"var ใช้ขึ้นอยู่กับขอบเขตของตัวแปร" - นี่คือการปฏิบัติที่ไม่ดี - ควรใช้ไม่ว่าคุณจะอยู่ในขอบเขตใด
treecoder

1
สิ่งที่เกี่ยวกับวิธีการ: Object.create()?
สูงสุด

มันจะดีถ้า“ ตามที่กล่าวไว้ว่าคุณสมบัติเป็นตัวแปร”ถูกชี้แจง มันคือใคร"? ที่กล่าวถึงอยู่ที่ไหน คุณสามารถอ้างอิงคำพูดเฉพาะได้หรือไม่?
user4642212

คำตอบ:


181

ไม่มีวิธีที่ดีที่สุดมันขึ้นอยู่กับกรณีการใช้งานของคุณ

  • ใช้วิธีที่ 1หากคุณต้องการสร้างวัตถุที่คล้ายกันหลายรายการ ในตัวอย่างของคุณPerson(คุณควรเริ่มต้นชื่อด้วยอักษรตัวใหญ่) เรียกว่าฟังก์ชั่นคอนสตรัค นี่คล้ายกับคลาสในภาษา OO อื่น ๆ
  • ใช้วิธีที่ 2หากคุณต้องการวัตถุชนิดเดียวเท่านั้น(เช่นซิงเกิลตัน) หากคุณต้องการให้วัตถุนี้สืบทอดจากวัตถุอื่นคุณต้องใช้ฟังก์ชั่น Constructor
  • ใช้วิธีที่ 3หากคุณต้องการเริ่มต้นคุณสมบัติของวัตถุขึ้นอยู่กับคุณสมบัติอื่น ๆ ของมันหรือถ้าคุณมีชื่อคุณสมบัติแบบไดนามิก

อัปเดต:ตามที่ร้องขอตัวอย่างสำหรับวิธีที่สาม

คุณสมบัติขึ้นอยู่กับ:

ต่อไปนี้จะไม่ทำงานตามที่thisไม่ได้bookหมายถึง ไม่มีวิธีการเตรียมใช้งานคุณสมบัติด้วยค่าของคุณสมบัติอื่น ๆ ในวัตถุตามตัวอักษร:

var book = {
    price: somePrice * discount,
    pages: 500,
    pricePerPage: this.price / this.pages
};

แต่คุณสามารถทำได้:

var book = {
    price: somePrice * discount,
    pages: 500
};
book.pricePerPage = book.price / book.pages;
// or book['pricePerPage'] = book.price / book.pages;

ชื่อคุณสมบัติแบบไดนามิก:

หากชื่อคุณสมบัติถูกเก็บไว้ในตัวแปรบางตัวหรือสร้างผ่านนิพจน์บางอย่างคุณต้องใช้เครื่องหมายวงเล็บ:

var name = 'propertyName';

// the property will be `name`, not `propertyName`
var obj = {
    name: 42
}; 

// same here
obj.name = 42;

// this works, it will set `propertyName`
obj[name] = 42;

1
ขอบคุณสำหรับคำตอบของคุณ ... ตอนนี้ฉันเข้าใจจุดแรกของคุณแล้วเราสามารถใช้ way1 ได้ถ้าเราต้องการบางสิ่งเช่น myFather = คนใหม่ ("John", "Doe", 50, "blue"); myMother = บุคคลใหม่ ("gazy", "Doe", 45, "brown"); myBrother = บุคคลใหม่ ("แบบสำรวจ", "Doe", 15, "blue");
Jamna

ฉันคิดว่าคุณหมายถึง obj [name] = 42 ใช่มั้ย
Keith Pinson

ฉันต้องการชี้ให้เห็นว่าตัวเลือกที่ 2 และ 3 นั้นเหมือนกันทุกประการเพียงแค่คุณกำหนดคุณสมบัติหลังจากที่คุณสร้างวัตถุ นี่คือสิ่งที่เรียกว่าสัญกรณ์ตามตัวอักษรเพราะคุณใช้วัตถุตามตัวอักษรเพื่อสร้างวัตถุของคุณ ภายใต้ประทุนนี้จะเรียกว่า "new Object ()" คุณสามารถอ่านเพิ่มเติมได้ที่นี่: developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/…
dudewad

สำหรับกรณีที่สองมันจะสมเหตุสมผลหรือไม่ถ้าเราใช้ตัวดำเนิน...การสเปรดเพื่อสืบทอดจากวัตถุอื่น
6pack kid

114

มีหลายวิธีในการกำหนดฟังก์ชั่น มันขึ้นอยู่กับความต้องการของคุณทั้งหมด ด้านล่างนี้เป็นรูปแบบบางส่วน: -

  1. ตัวสร้างวัตถุ
  2. ตัวสร้างตัวอักษร
  3. ตามฟังก์ชั่น
  4. Protoype Based
  5. ฟังก์ชั่นและต้นแบบ
  6. จาก Singleton

ตัวอย่าง:

  1. ตัวสร้างวัตถุ
var person = new Object();

person.name = "Anand",
person.getName = function(){
  return this.name ; 
};
  1. ตัวสร้างตัวอักษร
var person = { 
  name : "Anand",
  getName : function (){
   return this.name
  } 
} 
  1. ฟังก์ชั่นการสร้าง
function Person(name){
  this.name = name
  this.getName = function(){
    return this.name
  } 
} 
  1. แบบเดิม
function Person(){};

Person.prototype.name = "Anand";
  1. การรวมฟังก์ชั่น / ต้นแบบ
function Person(name){
  this.name = name;
} 
Person.prototype.getName = function(){
  return this.name
} 
  1. ซิงเกิล
var person = new function(){
  this.name = "Anand"
} 

คุณสามารถลองบนคอนโซลหากคุณมีความสับสน


HEy @Alex_Nabu - ฉันได้แชร์ตัวอย่างในโพสต์ของฉันแล้ว หากคุณยังคงเผชิญกับความท้าทายใด ๆ โปรดอัปเดตฉันฉันจะช่วยคุณ
Anand Deep Singh

1
มันจะไม่เหมาะสมกว่าหรือที่จะสร้างทุก ๆ ตัวอย่างที่ยอมให้var personอินสแตนซ์เดียวกันในตอนท้าย เช่นในตัวสร้างฟังก์ชันที่คุณสามารถเพิ่มvar person = new Person("Anand")ได้ และเกิดอะไรขึ้นกับการใช้เซมิโคลอนแบบสุ่ม : P
cregox

2
มันจะเพิ่มมูลค่าการอธิบายข้อดีข้อเสียของแต่ละวิธี
RayLoveless

10

ไม่มี "วิธีที่ดีที่สุด" ในการสร้างวัตถุ แต่ละวิธีมีประโยชน์ขึ้นอยู่กับการใช้งานของคุณ

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

อย่างไรก็ตามถ้าคุณต้องการรับมรดกต้นแบบคุณอาจใช้เช่นกันObject.createซึ่งทำให้การสืบทอดนั้นชัดเจนยิ่งขึ้น

การสร้างออบเจกต์ตามตัวอักษร (เช่น:) ใช้var obj = {foo: "bar"};งานได้ดีถ้าคุณมีคุณสมบัติทั้งหมดที่คุณต้องการตั้งไว้ในเวลาที่สร้าง

สำหรับการตั้งค่าคุณสมบัติในภายหลังNewObject.property1โดยทั่วไปไวยากรณ์จะดีกว่าNewObject['property1']ถ้าคุณรู้จักชื่อคุณสมบัติ แต่หลังจะเป็นประโยชน์เมื่อคุณไม่จริงมีชื่อข้างหน้าของโรงแรมของเวลา (เช่น: NewObject[someStringVar])

หวังว่านี่จะช่วยได้!


6

ฉันเดาว่ามันขึ้นอยู่กับสิ่งที่คุณต้องการ สำหรับวัตถุอย่างง่ายฉันคิดว่าคุณสามารถใช้วิธีที่สอง เมื่อวัตถุของคุณมีขนาดใหญ่ขึ้นและคุณวางแผนที่จะใช้วัตถุที่คล้ายกันฉันคิดว่าวิธีแรกจะดีกว่า ด้วยวิธีนี้คุณสามารถขยายโดยใช้ต้นแบบ

ตัวอย่าง:

function Circle(radius) {
    this.radius = radius;
}
Circle.prototype.getCircumference = function() {
    return Math.PI * 2 * this.radius;
};
Circle.prototype.getArea = function() {
    return Math.PI * this.radius * this.radius;
}

ผมไม่ได้เป็นแฟนตัวยงของวิธีที่สาม var foo='bar'; var bar = someObject[foo];แต่ก็มีประโยชน์จริงๆสำหรับคุณสมบัติการแก้ไขแบบไดนามิกเช่น


3

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

ฟังก์ชันตัวสร้าง

มีฟังก์ชั่นตัวสร้างที่เราทุกคนอาจใช้พวกเขาเป็นครั้งคราวเช่นวันที่ (), จำนวน (), บูลีน () ฯลฯ ฟังก์ชั่นตัวสร้างทั้งหมดเริ่มต้นด้วยตัวอักษรตัวใหญ่ในขณะเดียวกันเราสามารถสร้างฟังก์ชั่นกำหนดเองใน JavaScript แบบนี้:

function Box (Width, Height, fill) {  
  this.width = Width;  // The width of the box 
  this.height = Height;  // The height of the box 
  this.fill = true;  // Is it filled or not?
}  

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

var newBox = new Box(8, 12, true);  

ตัวอักษรวัตถุ

การใช้ตัวอักษรออบเจ็กต์เป็นกรณีที่ใช้สร้างวัตถุใน JavaScript ซึ่งเป็นตัวอย่างของการสร้างออบเจ็กต์อย่างง่ายคุณสามารถกำหนดสิ่งใดก็ได้ให้กับคุณสมบัติออบเจ็กต์ของคุณตราบใดที่มันถูกกำหนด:

var person = { 
    name: "Alireza",
    surname: "Dezfoolian"
    nose: 1,  
    feet: 2,  
    hands: 2,
    cash: null
};  

การสร้างต้นแบบ

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

Box.prototype.colour = 'red';

2

ในขณะที่คนจำนวนมากที่นี่บอกว่าไม่มีวิธีที่ดีที่สุดสำหรับการสร้างวัตถุ แต่มีเหตุผลว่าทำไมมีหลายวิธีในการสร้างวัตถุใน JavaScript ในปี 2019 และสิ่งนี้เกี่ยวข้องกับความคืบหน้าของ JavaScript ในการทำซ้ำที่แตกต่างกัน ของ EcmaScript ออกมาตั้งแต่ปี 1997

ก่อน ECMAScript 5 มีเพียงสองวิธีในการสร้างออบเจ็กต์: ฟังก์ชันคอนสตรัคเตอร์หรือสัญกรณ์สัญพจน์ (ทางเลือกที่ดีกว่าสำหรับออบเจ็กต์ใหม่) ด้วยสัญกรณ์ฟังก์ชั่นคอนสตรัคคุณสร้างวัตถุที่สามารถยกตัวอย่างเป็นหลายอินสแตนซ์ (ด้วยคำหลักใหม่) ในขณะที่สัญกรณ์ตัวอักษรส่งวัตถุเดียวเช่นเดียว

// constructor function
function Person() {};

// literal notation
var Person = {};

ไม่ว่าคุณจะใช้วิธีใดวัตถุ JavaScript เป็นคุณสมบัติของคู่ค่าคีย์:

// Method 1: dot notation
obj.firstName = 'Bob';

// Method 2: bracket notation. With bracket notation, you can use invalid characters for a javascript identifier.
obj['lastName'] = 'Smith';

// Method 3: Object.defineProperty
Object.defineProperty(obj, 'firstName', {
    value: 'Bob',
    writable: true,
    configurable: true,
    enumerable: false
})

// Method 4: Object.defineProperties
Object.defineProperties(obj, {
  firstName: {
    value: 'Bob',
    writable: true
  },
  lastName: {
    value: 'Smith',
    writable: false
  }
});

ในรุ่นแรก ๆ ของ JavaScript วิธีเดียวที่จะเลียนแบบการสืบทอดคลาสได้คือการใช้ฟังก์ชันตัวสร้าง ฟังก์ชั่นคอนสตรัคเป็นฟังก์ชั่นพิเศษที่ถูกเรียกด้วยคำหลัก 'ใหม่' โดยการประชุมตัวระบุฟังก์ชั่นเป็นตัวพิมพ์ใหญ่มันไม่จำเป็น ภายใน Constructor เราอ้างถึงคำสำคัญ 'this' เพื่อเพิ่มคุณสมบัติให้กับวัตถุที่ฟังก์ชัน Constructor สร้างขึ้นโดยปริยาย ฟังก์ชั่นคอนสตรัคส่งกลับวัตถุใหม่ที่มีคุณสมบัติที่มีประชากรกลับไปที่ฟังก์ชั่นการโทรโดยปริยายเว้นแต่คุณจะใช้คำหลักกลับมาอย่างชัดเจนและส่งกลับอย่างอื่น

function Person(firstName, lastName) {
    this.firstName = firstName;
    this.lastName = lastName;

    this.sayName = function(){
        return "My name is " + this.firstName + " " + this.lastName;
    }
} 

var bob = new Person("Bob", "Smith");
bob instanceOf Person // true

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

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

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

function Parent(eyeColor, hairColor) {
    this.eyeColor = eyeColor;
    this.hairColor = hairColor;
}

Parent.prototype.getEyeColor = function() {
  console.log('has ' + this.eyeColor);
}

Parent.prototype.getHairColor = function() {
  console.log('has ' + this.hairColor);
}

function Child(firstName, lastName) {
  Parent.call(this, arguments[2], arguments[3]);
  this.firstName = firstName;
  this.lastName = lastName;
}

Child.prototype = Parent.prototype;

var child = new Child('Bob', 'Smith', 'blue', 'blonde');
child.getEyeColor(); // has blue eyes
child.getHairColor(); // has blonde hair

วิธีที่เราใช้โซ่ต้นแบบด้านบนมีมุมแปลกประหลาด เนื่องจากต้นแบบเป็นลิงค์สดโดยการเปลี่ยนคุณสมบัติของวัตถุหนึ่งชิ้นในห่วงโซ่ต้นแบบคุณจะเปลี่ยนคุณสมบัติเดียวกันของวัตถุอื่นเช่นกัน เห็นได้ชัดว่าการเปลี่ยนวิธีการสืบทอดของเด็กไม่ควรเปลี่ยนวิธีการของผู้ปกครอง Object.create แก้ไขปัญหานี้โดยใช้ polyfill ดังนั้นด้วย Object.create คุณสามารถปรับเปลี่ยนคุณสมบัติของเด็กได้อย่างปลอดภัยในเชนต้นแบบโดยไม่ส่งผลกระทบต่อคุณสมบัติเดียวกันของผู้ปกครองในเชนต้นแบบ

ECMAScript 5 แนะนำ Object.create เพื่อแก้ไขข้อผิดพลาดดังกล่าวในฟังก์ชันตัวสร้างสำหรับการสร้างวัตถุ กระบวนการ Object.create () วิธีการสร้างวัตถุใหม่โดยใช้วัตถุที่มีอยู่เป็นต้นแบบของวัตถุที่สร้างขึ้นใหม่ เนื่องจากมีการสร้างวัตถุใหม่คุณไม่มีปัญหาในการแก้ไขคุณสมบัติลูกในเชนลูกโซ่ต้นแบบอีกต่อไปจะแก้ไขการอ้างอิงของผู้ปกครองกับคุณสมบัตินั้นในเชน

var bobSmith = {
    firstName: "Bob",
    lastName: "Smith",
    sayName: function(){
      return "My name is " + this.firstName + " " + this.lastName;
    }
}

var janeSmith = Object.create(bobSmith, {
    firstName : {  value: "Jane" }
})

console.log(bobSmith.sayName()); // My name is Bob Smith
console.log(janeSmith.sayName()); // My name is Jane Smith
janeSmith.__proto__ == bobSmith; // true
janeSmith instanceof bobSmith; // Uncaught TypeError: Right-hand side of 'instanceof' is not callable. Error occurs because bobSmith is not a constructor function.

ก่อน ES6 ต่อไปนี้เป็นรูปแบบการสร้างทั่วไปเพื่อใช้ตัวสร้างฟังก์ชันและ Object.create:

const View = function(element){
  this.element = element;
}

View.prototype = {
  getElement: function(){
    this.element
  }
}

const SubView = function(element){
  View.call(this, element);
}

SubView.prototype = Object.create(View.prototype);

ตอนนี้ Object.create ควบคู่ไปกับฟังก์ชั่นคอนสตรัคเตอร์ถูกนำมาใช้กันอย่างแพร่หลายสำหรับการสร้างวัตถุและการสืบทอดใน JavaScript อย่างไรก็ตาม ES6 นำเสนอแนวคิดของคลาสซึ่งส่วนใหญ่เป็นประโยคเกี่ยวกับการสร้างรหัสผ่านสำหรับการสืบทอดจากต้นแบบที่มีอยู่ของ JavaScript ไวยากรณ์คลาสไม่แนะนำโมเดลการสืบทอดเชิงวัตถุใหม่ให้กับ JavaScript ดังนั้น JavaScript ยังคงเป็นภาษาต้นแบบ

คลาส ES6 ทำให้การสืบทอดง่ายขึ้นมาก เราไม่จำเป็นต้องคัดลอกฟังก์ชั่นต้นแบบของผู้ปกครองด้วยตนเองและรีเซ็ตตัวสร้างของคลาสลูก

// create parent class
class Person {
  constructor (name) {
    this.name = name;
  }
}

// create child class and extend our parent class
class Boy extends Person {
  constructor (name, color) {
    // invoke our parent constructor function passing in any required parameters
    super(name);

    this.favoriteColor = color;
  }
}

const boy = new Boy('bob', 'blue')
boy.favoriteColor; // blue

สรุปกลยุทธ์การสร้าง Object ใน JavaScript ทั้ง 5 นี้สอดคล้องกับวิวัฒนาการของมาตรฐาน EcmaScript


0

แน่นอนว่ามีวิธีที่ดีที่สุดอ็อบเจ็กใน javascript มีคุณสมบัติมากมายและไม่นับจำนวน

var empty = {};
console.log(empty.toString);
// . function toString(){...}
console.log(empty.toString());
// . [object Object]

ในตัวอย่างด้านบนคุณจะเห็นว่าวัตถุเปล่ามีคุณสมบัติจริง

โอเคก่อนอื่นมาดูกันว่าวิธีไหนดีที่สุด:

var new_object = Object.create(null)

new_object.name = 'Roland'
new_object.last_name = 'Doda'
//etc

console.log("toString" in new_object) //=> false

ในตัวอย่างด้านบนบันทึกจะแสดงผลลัพธ์เป็นเท็จ

ตอนนี้เรามาดูสาเหตุที่วิธีการสร้างวัตถุอื่น ๆ ไม่ถูกต้อง

//Object constructor
var object = new Object();

console.log("toString" in object); //=> true

//Literal constructor
var person = { 
  name : "Anand",
  getName : function (){
   return this.name
  } 
} 

console.log("toString" in person); //=> true

//function Constructor
function Person(name){
  this.name = name
  this.getName = function(){
    return this.name
  } 
}

var person = new Person ('landi')

console.log("toString" in person); //=> true

//Prototype
function Person(){};

Person.prototype.name = "Anand";

console.log("toString" in person); //=> true

//Function/Prototype combination
function Person2(name){
  this.name = name;
} 

Person2.prototype.getName = function(){
  return this.name
}

var person2 = new Person2('Roland')

console.log("toString" in person2) //=> true

ดังที่คุณเห็นข้างต้นตัวอย่างทั้งหมดจะบันทึกจริงซึ่งหมายความว่าหากคุณมีกรณีที่คุณมีการfor inวนรอบเพื่อดูว่าวัตถุที่มีคุณสมบัติจะนำคุณไปสู่ผลลัพธ์ที่ไม่ถูกต้องหรือไม่

โปรดทราบว่าวิธีที่ดีที่สุดนั้นไม่ใช่เรื่องง่ายคุณต้องกำหนดคุณสมบัติทั้งหมดของออบเจ็กต์ทีละบรรทัดวิธีอื่นนั้นง่ายกว่าและจะมีโค้ดน้อยกว่าในการสร้างออบเจ็กต์ แต่คุณต้องระวังในบางกรณี ฉันมักจะใช้ "วิธีอื่น ๆ " โดยวิธีการและวิธีการแก้ปัญหาข้างต้นเตือนถ้าคุณไม่ได้ใช้วิธีที่ดีที่สุดคือ:

 for (var property in new_object) {
  if (new_object.hasOwnProperty(property)) {
    // ... this is an own property
  }
 }

0

ส่วนใหญ่มี 3 วิธีในการสร้างวัตถุ -

หนึ่งที่ง่ายที่สุดคือการใช้ตัวอักษรของวัตถุ

const myObject = {}

แม้ว่าวิธีนี้จะง่ายที่สุด แต่ก็มีข้อเสียคือถ้าวัตถุของคุณมีพฤติกรรม (ฟังก์ชั่นในตัว) แล้วในอนาคตถ้าคุณต้องการที่จะเปลี่ยนแปลงมันคุณจะต้องเปลี่ยนมันในวัตถุทั้งหมด

ดังนั้นในกรณีนั้นควรใช้ฟังก์ชั่น Factory หรือ Constructor (ทุกคนที่คุณชอบ)

ฟังก์ชั่นจากโรงงานคือฟังก์ชั่นเหล่านั้นที่คืนค่าวัตถุ

function factoryFunc(exampleValue){
   return{
      exampleProperty: exampleValue 
   }
}

ฟังก์ชั่นการสร้างเป็นฟังก์ชั่นเหล่านั้นที่กำหนดคุณสมบัติให้กับวัตถุโดยใช้ "this" keyword.eg-

function constructorFunc(exampleValue){
   this.exampleProperty= exampleValue;
}
const myObj= new constructorFunc(1);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.