나는 자바 스크립트에서 객체를 생성 해야하는 방법에 대해 혼란스러워합니다. 적어도 두 가지 방법이있는 것 같습니다. 하나는 객체 리터럴 표기법을 사용하는 것이고 다른 하나는 구성 함수를 사용하는 것입니다. 하나의 장점이 다른 것보다 있습니까?
답변
객체와 관련된 동작이없는 경우 (즉, 객체가 데이터 / 상태에 대한 컨테이너 일 경우) 객체 리터럴을 사용합니다.
var data = {
foo: 42,
bar: 43
};
KISS 원칙을 적용합니다 . 단순한 데이터 컨테이너 이상의 것이 필요하지 않다면 단순한 리터럴을 사용하십시오.
객체에 비헤이비어를 추가하려면 생성자를 사용하여 생성 중에 객체에 메서드를 추가하거나 클래스에 프로토 타입을 제공 할 수 있습니다.
function MyData(foo, bar) {
this.foo = foo;
this.bar = bar;
this.verify = function () {
return this.foo === this.bar;
};
}
// or:
MyData.prototype.verify = function () {
return this.foo === this.bar;
};
이와 같은 클래스는 데이터 개체의 스키마처럼 작동합니다. 이제 개체가 초기화 / 포함하는 속성이 생성자를 통해 일종의 계약이 생깁니다. 자유 리터럴은 비정질 데이터 덩어리입니다.
verify
일반 오래된 데이터 개체에 대해 작동 하는 외부 함수 가있을 수도 있습니다 .
var data = {
foo: 42,
bar: 43
};
function verify(data) {
return data.foo === data.bar;
}
그러나 이는 캡슐화와 관련하여 바람직하지 않습니다. 이상적으로는 엔티티와 관련된 모든 데이터 + 동작이 함께 살아야합니다.
답변
본질적으로 객체의 여러 인스턴스가 필요한지 여부로 요약됩니다. 생성자로 정의 된 객체를 사용하면 해당 객체의 여러 인스턴스를 가질 수 있습니다. 객체 리터럴은 기본적으로 모두 공개 된 변수 / 메서드가있는 싱글 톤입니다.
// define the objects:
var objLit = {
x: 0,
y: 0,
z: 0,
add: function () {
return this.x + this.y + this.z;
}
};
var ObjCon = function(_x, _y, _z) {
var x = _x; // private
var y = _y; // private
this.z = _z; // public
this.add = function () {
return x + y + this.z; // note x, y doesn't need this.
};
};
// use the objects:
objLit.x = 3;
objLit.y = 2;
objLit.z = 1;
console.log(objLit.add());
var objConIntance = new ObjCon(5,4,3); // instantiate an objCon
console.log(objConIntance.add());
console.log((new ObjCon(7,8,9)).add()); // another instance of objCon
console.log(objConIntance.add()); // same result, not affected by previous line
답변
균일 한 방식으로 객체를 생성하는 또 다른 방법은 객체를 반환하는 함수를 사용하는 것입니다.
function makeObject() {
var that = {
thisIsPublic: "a public variable"
thisIsAlsoPublic: function () {
alert(that.thisIsPublic);
}
};
var secret = "this is a private variable"
function secretFunction() { // private method
secret += "!"; // can manipulate private variables
that.thisIsPublic = "foo";
}
that.publicMethod = function () {
secret += "?"; // this method can also mess with private variables
}
that.anotherPublicVariable = "baz";
return that; // this is the object we've constructed
}
makeObject.static = "This can be used to add a static varaible/method";
var bar = makeObject();
bar.publicMethod(); // ok
alert(bar.thisIsPublic); // ok
bar.secretFunction(); // error!
bar.secret // error!
JavaScript의 함수는 클로저이기 때문에 개인 변수와 메서드를 사용하고 new
.
에서 http://javascript.crockford.com/private.html 자바 스크립트에서 private 변수에.
답변
아래 코드는 객체를 생성하는 세 가지 방법 인 Object Literal 구문, 함수 생성자 및 Object.create()
. 객체 리터럴 구문은 즉시 생성하고 객체를 생성 __prototype__
하므로 Object
객체 이므로의 모든 속성과 메서드에 액세스 할 수 있습니다 Object
. 엄격하게 디자인 패턴 관점에서 간단한 개체 리터럴을 사용하여 단일 데이터 인스턴스를 저장해야합니다.
함수 생성자에는이라는 특수 속성이 .prototype
있습니다. 이 속성은 __prototype__
함수 생성자가 만든 모든 개체의 속성이됩니다 . .prototype
함수 생성자 의 속성에 추가 된 모든 속성과 메서드 는 생성 된 모든 개체에서 사용할 수 있습니다. 데이터의 여러 인스턴스가 필요하거나 개체의 동작이 필요한 경우 생성자를 사용해야합니다. 함수 생성자는 개인 / 공개 개발 패턴을 시뮬레이션하려는 경우에도 가장 잘 사용됩니다. 모든 공유 메서드를에 배치하여 .prototype
각 개체 인스턴스에서 생성되지 않도록해야합니다.
Object.create()
로 __prototype__
객체를 생성하면이 메소드로 생성 된 객체에 대해 객체 리터럴 을 사용합니다 . 객체 리터럴에 추가 된 모든 속성과 메서드는 진정한 프로토 타입 상속을 통해 생성 된 모든 객체에서 사용할 수 있습니다. 이것이 제가 선호하는 방법입니다.
//Object Example
//Simple Object Literal
var mySimpleObj = {
prop1 : "value",
prop2 : "value"
}
// Function Constructor
function PersonObjConstr() {
var privateProp = "this is private";
this.firstname = "John";
this.lastname = "Doe";
}
PersonObjConstr.prototype.greetFullName = function() {
return "PersonObjConstr says: Hello " + this.firstname +
" " + this.lastname;
};
// Object Literal
var personObjLit = {
firstname : "John",
lastname: "Doe",
greetFullName : function() {
return "personObjLit says: Hello " + this.firstname +
", " + this.lastname;
}
}
var newVar = mySimpleObj.prop1;
var newName = new PersonObjConstr();
var newName2 = Object.create(personObjLit);
답변
무엇을하고 싶은지에 따라 다릅니다. 객체에서 (반) 개인 변수 또는 함수를 사용하려는 경우 생성자 함수가이를 수행하는 방법입니다. 개체에 속성과 메서드 만 포함되어있는 경우 개체 리터럴이 좋습니다.
function SomeConstructor(){
var x = 5;
this.multiply5 = function(i){
return x*i;
}
}
var myObj = new SomeConstructor;
var SomeLiteral = {
multiply5: function(i){ return i*5; }
}
이제 방법 multiply5
에서 myObj
와 SomeLiteral
정확히 같은 일을. 유일한 차이점은 myObj가 전용 변수를 사용한다는 것입니다. 후자는 경우에 따라 유용 할 수 있습니다. 대부분의 경우 객체 리터럴은 충분하고 JS 객체를 생성하는 훌륭하고 깨끗한 방법입니다.
답변
페이지에 대한 개체의 단일 인스턴스를 원하십니까-Literal.
DTO 개체와 같은 데이터를 간단하게 전송하고 싶습니까? GET SET :-Literal
메서드 동작, 다중 인스턴스-생성자 함수, OOP 원칙 따르기, 상속 :-생성자 함수를 사용하여 실제 개체를 만들고 싶습니까?
아래는 리터럴이 무엇인지, 생성자 함수가 무엇이며 서로 어떻게 다른지 자세히 설명하는 YouTube 동영상입니다.
답변
객체 리터럴로 이동하면 초기 값의 도입으로 더 간결하고 더 잘 확장됩니다.