Baseline Widely available
Object.defineProperty()
ì ì ë©ìëë ê°ì²´ì ìë¡ì´ ìì±ì ì§ì ì ìíê±°ë ì´ë¯¸ ì¡´ì¬íë ìì±ì ìì í í, í´ë¹ ê°ì²´ë¥¼ ë°íí©ëë¤.
const object1 = {};
Object.defineProperty(object1, "property1", {
value: 42,
writable: false,
});
object1.property1 = 77;
// Throws an error in strict mode
console.log(object1.property1);
// Expected output: 42
구문
Object.defineProperty(obj, prop, descriptor);
매ê°ë³ì
obj
ìì±ì ì ìí ê°ì²´.
prop
ìë¡ ì ìíê±°ë ìì íë ¤ë ìì±ì ì´ë¦ ëë Symbol
.
descriptor
ìë¡ ì ìíê±°ë ìì íë ¤ë ìì±ì 기ì íë ê°ì²´.
obj
ê°ì²´.
defineProperty
ë©ìë를 ì¬ì©íë©´ ê°ì²´ì ìì±ì ì¸ë°íê² ì¶ê°íê±°ë ìì í ì ììµëë¤. í ë¹ì íµí´ ìì±ì ì¶ê°íë ì¼ë°ì ì¸ ë°©ë²ì¼ë¡ ì¶ê°í ìì±ì ê°ì²´ì ìì±ì ì´ê±°(for...in
ë°ë³µë¬¸ ëë Object.keys
ë©ìë)í ë ë
¸ì¶ëë©°, ìíëëë¡ ê°ì ë³ê²½íê³ delete
ì°ì°ìë¡ ìì í ìë ììµëë¤. defineProperty
를 ì¬ì©íë©´ ì´ë° 기본 ëìê¹ì§ë ìì¸íê² ì¡°ì í ì ììµëë¤. Object.defineProperty()
ë¡ ì¶ê°í ìì±ì 기본ì ì¼ë¡ ë¶ë³íë©° ì´ê±° ë¶ê°ë¥í©ëë¤.
ìì± ìì ì(descriptor
)ë ë°ì´í° ìì ì(data descriptors)ì ì ê·¼ì ìì ì(accessor descriptors) ë ê°ì§ íìì ì·¨í ì ììµëë¤. ë°ì´í° ìì ìë ê°ì ê°ì§ë ìì±ì 기ì í ë ì¬ì©í©ëë¤. ì ê·¼ì ìì ìë ì ê·¼ì(getter)-ì¤ì ì(setter) í¨ì를 í ìì¼ë¡ ê°ì§ë ìì±ì 기ì í ë ì¬ì©í©ëë¤. ìì ìë ë ì í ì¤ íëì¬ì¼ íë©°, ë ì íì ëìì ëíë¼ ìë ììµëë¤.
ë°ì´í° ìì ìì ì ê·¼ì ìì ìë 모ë ê°ì²´ë¡, ë¤ìì ì íì í¤ë¥¼ ìë¡ ê³µì í©ëë¤.
ì°¸ê³ : ìëìì ì¤ëª
íë 기본 ê°ì Object.defineProperty()
ë¡ ì ìí ìì±ì 기본 ëìì ì미í©ëë¤.
configurable
ìì±ì ê°ì ë³ê²½í ì ìê³ , ê°ì²´ìì ìì í ìë ìì¼ë©´ true
ì
ëë¤. 기본 ê°ì false
ì
ëë¤.
enumerable
ìì±ì´ ê°ì²´ì ìì± ì´ê±° ì ë
¸ì¶ëë©´ true
ì
ëë¤. 기본 ê°ì false
ì
ëë¤.
ë°ì´í° ìì ìë ë¤ìì í¤ë¥¼ ì íì ì¼ë¡ í¬í¨í ì ììµëë¤.
value
ìì±ì ì°ê´ë ê°ì
ëë¤. ì í¨í JavaScript ê°(ì«ì, ê°ì²´, í¨ì ë±)ì 모ë ì¬ì©í ì ììµëë¤. 기본 ê°ì undefined
ì
ëë¤.
writable
í ë¹ ì°ì°ìë¡ ìì±ì ê°ì ë°ê¿ ì ìì¼ë©´ true
ì
ëë¤. 기본 ê°ì false
ì
ëë¤.
ì ê·¼ì ìì ìë ë¤ì í¤ë¥¼ ì íì¬íì¼ë¡ ê°ì§ëë¤.
get
ìì±ì ì ê·¼ìë¡ ì¬ì©í í¨ìì
ëë¤. ì ê·¼ìê° ìì¼ë©´ undefined
ì
ëë¤. ì´ ìì±ì ì ê·¼íë©´, ì ê·¼í ë ì¬ì©í ê°ì²´(ìì±ì ì£¼ì¸ ê°ì²´ì ë¤ë¥¼ ì ìì)를 ì´ í¨ìì this
ë¡ ì¤ì íê³ , 매ê°ë³ì ìì´ í¸ì¶í ë¤ ê·¸ ë°í ê°ì ì´ ìì±ì ê°ì¼ë¡ ì·¨ê¸í©ëë¤. 기본 ê°ì undefined
ì
ëë¤.
set
ìì±ì ì¤ì ìë¡ ì¬ì©í í¨ìì
ëë¤. ì¤ì ìê° ìì¼ë©´ undefined
ì
ëë¤. ì´ ìì±ì ê°ì í ë¹íë©´, í ë¹í ë ì¬ì©í ê°ì²´ë¥¼ ì´ í¨ìì this
ë¡ ì¤ì íê³ , í ê°ì 매ê°ë³ì(í ë¹ ì¤ì¸ ê°)ë¡ í¸ì¶í©ëë¤. 기본 ê°ì undefined
ì
ëë¤.
value
, writable
, get
, set
í¤ë¥¼ 모ë ì§ëê³ ìì§ ìì ìì ìë ë°ì´í° ìì ìë¡ ê°ì£¼í©ëë¤. ë°ë©´ value
ëë writable
ì get
ëë set
í¤ì í¨ê» ê°ì§ê³ ìì¼ë©´ ì¤ë¥ê° ë°ìí©ëë¤.
ìì ê° ì¤ì ì´ ìì ìì ìì²´ ìì±ì¼ íìë ìì¼ë©°, ìì ìê° ììíë ìì±ë ê³ ë ¤í©ëë¤. 기본 ê°ì íì¤íê² ë³´ì¡´íë ¤ë©´ Object
를 먼ì ëê²°íê±°ë, 모ë ì¤ì ì ì§ì ëª
ìíê±°ë, Object.create(null)
ì ì¬ì©í´ ìì ìì íë¡í íì
ì´ null
ì ê°ë¦¬í¤ëë¡ íì¸ì.
// __proto__ ì¬ì©
var obj = {};
var descriptor = Object.create(null); // ììë°ì ìì± ìì
descriptor.value = "static";
// 기본 ê°ì ì´ê±° ë¶ê°, ì¤ì ë¶ê°, ì°ê¸° ë¶ê°
Object.defineProperty(obj, "key", descriptor);
// 기본 ê° ëª
ìí기
Object.defineProperty(obj, "key", {
enumerable: false,
configurable: false,
writable: false,
value: "static",
});
// ê°ì ê°ì²´ë¥¼ ì¬íì©í기
function withValue(value) {
var d =
withValue.d ||
(withValue.d = {
enumerable: false,
writable: false,
configurable: false,
value: null,
});
// ì¤ë³µ í ë¹ ë°©ì§
if (d.value !== value) d.value = value;
return d;
}
Object.defineProperty(obj, "key", withValue("static"));
// ê°ì²´ ëê²°ì ì¬ì©í ì ìë¤ë©´ íë¡í íì
ì ë³íì ë°©ì§í기
// (value, get, set, enumerable, writable, configurable)
(Object.freeze || Object)(Object.prototype);
ìì ìì± ìì±í기
Object.defineProperty()
ë ê°ë¦¬í¨ ìì±ì´ ê°ì²´ì ì¡´ì¬íì§ ìì¼ë©´ ìì ì를 ì¬ì©í´ ìì±ì ê°ì²´ì ìë¡ ìì±í©ëë¤. ìì ìì ì¼ë¶ í목ì ìëµ ê°ë¥íë©°, ìëµí í목ìë 기본 ê°ì ì¬ì©í©ëë¤.
var o = {}; // ìë¡ì´ ê°ì²´ ìì±
// ê° ìì± ìì ìì definePropertyë¡
// ìë¡ì´ ìì±ì ì¶ê°íë ìì
Object.defineProperty(o, "a", {
value: 37,
writable: true,
enumerable: true,
configurable: true,
});
// 'a' ìì±ì´ o ê°ì²´ì ì¡´ì¬íê³ ê°ì 37
// ì ê·¼ì ìì± ê¸°ì ìì definePropertyë¡
// ìë¡ì´ ìì±ì ì¶ê°íë ìì
var bValue = 38;
Object.defineProperty(o, "b", {
// ES2015 ë¨ì¶ ë©ìëëª
ì¬ì©
// ìë ì½ëì ê°ì
// get: function() { return bValue; }
// set: function(newValue) { bValue = newValue; },
get() {
return bValue;
},
set(newValue) {
bValue = newValue;
},
enumerable: true,
configurable: true,
});
o.b; // 38
// 'b' ìì±ì´ o ê°ì²´ì ì¡´ì¬íê³ ê°ì 38
// o.b를 ì¬ì ìíì§ ìë ì´ì
// o.bì ê°ì íì bValueì ëì¼í¨
// ë ê°ì§ë¥¼ í¼ì©í ìë ìì
Object.defineProperty(o, "conflict", {
value: 0x9f91102,
get: function () {
return 0xdeadbeef;
},
});
// TypeError ë°ì
// valueë ë°ì´í° ìì ììë§,
// getì ì ê·¼ì ìì ììë§ ëíë ì ìì
ìì± ìì í기
ObjectdefineProperty()
ë ê°ë¦¬í¨ ìì±ì´ ê°ì²´ì ì´ë¯¸ ì¡´ì¬íë©´, 주ì´ì§ ìì ìì í´ë¹ ìì±ì 기존 ì¤ì ì ë°ë¼ ìì±ì ìì ì ìëí©ëë¤. 기존 ìì±ì configurable
í¹ì±ì´ false
ì¼ ë, í´ë¹ ìì±ì´ "ì¤ì ë¶ê°ë¥"íë¤ê³ ë§í©ëë¤. ì ê·¼ì ìì±ì´ ì¤ì ë¶ê°ë¥íë©´ ìì±ì 모ë í¹ì±ì ìì í ì ììµëë¤. ê° ìì±ì ì¤ì ë¶ê°ë¥íëë¼ë writable
í¹ì±ì ë°ê¿ ì ìê³ , ì°ê¸° ê°ë¥í ê²½ì° value
ë ë°ê¿ ì ììµëë¤. ì¤ì ë¶ê°ë¥í ìì±ì ì íì ë³ê²½(ê° ìì±ì ì ê·¼ì ìì±ì¼ë¡, í¹ì ê·¸ ë°ëë¡)íë ê²ì ë¶ê°ë¥í©ëë¤.
ì¤ì ë¶ê°ë¥í ìì±ì í¹ì±ì ë°ê¾¸ë ¤ê³ ìëíë©´ TypeError
ê° ë°ìí©ëë¤. ë¨, 기존 ê°ì´ ì ê· ê°ê³¼ ê°ê±°ë, ê° ìì±ì value
(ì°ê¸° ê°ë¥í ë)ì writable
ì ìì íë ê²½ì°ìë ì¤ë¥ê° ë°ìíì§ ììµëë¤.
writable
í¹ì±
writable
í¹ì±ì´ false
ì¸ ìì±ì "ì°ê¸° ë¶ê°ë¥"íì¬ ë¤ì í ë¹í ì ììµëë¤.
var o = {}; // ìë¡ì´ ê°ì²´ ìì±
Object.defineProperty(o, "a", {
value: 37,
writable: false,
});
console.log(o.a); // 37 기ë¡
o.a = 25; // ì¤ë¥ ë°ìíì§ ìì
// ë¨, ì격 모ëììë ê°ì´ ê°ëë¼ë ì¤ë¥ê° ë°ìíì ê²
console.log(o.a); // 37 기ë¡, 25ê° í ë¹ëì§ ìì
// ì격 모ë
(function () {
"use strict";
var o = {};
Object.defineProperty(o, "b", {
value: 2,
writable: false,
});
o.b = 3; // TypeError: "b" is read-only
return o.b; // ìì¤ì´ ìë¤ë©´ 2 ë°í
})();
ìì ìì ìì íì¸í ì ìë¯, ì격 모ëê° ìëë¼ë©´ ì°ê¸° ë¶ê°ë¥í ìì±ì í ë¹ì ìëíë©´ ê°ì´ ë°ëì§ë ìê³ , ì¤ë¥ê° ë°ìíì§ë ììµëë¤.
enumerable
í¹ì±
enumerable
í¹ì±ì Object.assign()
ê³¼ ì ê° ì°ì°ìê° ìì±ì ë³¼ ì ìëì§, ìëì§ë¥¼ ê²°ì í©ëë¤. ì´ì ëí´, ë¹ Symbol
ìì±ì ëí´ìë for...in
ë°ë³µë¬¸ê³¼ Object.keys()
ììì ë
¸ì¶ ì¬ë¶ë ì¶ê°ë¡ ê²°ì í©ëë¤.
var o = {};
Object.defineProperty(o, "a", {
value: 1,
enumerable: true,
});
Object.defineProperty(o, "b", {
value: 2,
enumerable: false,
});
Object.defineProperty(o, "c", {
value: 3,
}); // enumerableì 기본 ê°ì false
o.d = 4; // í ë¹ì íµí ìì± ììë
// enumerableì 기본 ê°ì´ true
Object.defineProperty(o, Symbol.for("e"), {
value: 5,
enumerable: true,
});
Object.defineProperty(o, Symbol.for("f"), {
value: 6,
enumerable: false,
});
for (var i in o) {
console.log(i);
}
// 'a'ì 'd' 기ë¡
Object.keys(o); // ['a', 'd']
o.propertyIsEnumerable("a"); // true
o.propertyIsEnumerable("b"); // false
o.propertyIsEnumerable("c"); // false
o.propertyIsEnumerable("d"); // true
o.propertyIsEnumerable(Symbol.for("e")); // true
o.propertyIsEnumerable(Symbol.for("f")); // false
var p = { ...o };
p.a; // 1
p.b; // undefined
p.c; // undefined
p.d; // 4
p[Symbol.for("e")]; // 5
p[Symbol.for("f")]; // undefined
configurable
í¹ì±
configurable
í¹ì±ì ê°ì²´ìì ì´ ìì±ì ì ê±°í ì ìëì§, ê·¸ë¦¬ê³ ìì±ì (value
ì writable
ì ì ì¸í) í¹ì±ì ë°ê¿ ì ìëì§ ê²°ì í©ëë¤.
var o = {};
Object.defineProperty(o, "a", {
get() {
return 1;
},
configurable: false,
});
Object.defineProperty(o, "a", {
configurable: true,
}); // TypeError
Object.defineProperty(o, "a", {
enumerable: true,
}); // TypeError
Object.defineProperty(o, "a", {
set() {},
}); // TypeError (setì´ undefinedìì)
Object.defineProperty(o, "a", {
get() {
return 1;
},
}); // TypeError
// (ííë ê°ì§ë§ ìë¡ ë¤ë¥¸ í¨ìì´ë¯ë¡)
Object.defineProperty(o, "a", {
value: 12,
}); // TypeError
// (configurableì´ falseì¬ë valueë ë°ê¿ ì ìì§ë§, ìì±ì 기존 get ì ê·¼ìë¡ ì¸í´ ë³ê²½ ë¶ê°)
console.log(o.a); // 1 기ë¡
delete o.a; // ì무 ì¼ë ìì
console.log(o.a); // 1 기ë¡
o.a
ì configurable
ì´ true
ìë¤ë©´ ì¤ë¥ê° ë°ìíì§ë ìê³ , ë§ì§ë§ì ê°ì²´ìì ìì ë ê°ë¥íì ê²ì
ëë¤.
ìì± ì¶ê° ì, ê° í¹ì±ì 기본 ê°ì ì ì©íë ë°©ìì ì¤ìíê² ê³ ë ¤í´ì¼ í©ëë¤. ì¼ë° ìì± ì ê·¼ 구문(o.a
)ì í ë¹í´ ìì±ì ì¶ê°íë ê²ê³¼, Object.defineProperty()
를 ì¬ì©í´ ì¶ê°íë ê²½ì°ì í¹ì± 기본 ê°ì ìë ìì ìì ë³´ì´ë¯ ìë¡ ë¤ë¦
ëë¤.
var o = {};
o.a = 1;
// ìì í ë¹ì ìëì ê°ì
Object.defineProperty(o, "a", {
value: 1,
writable: true,
configurable: true,
enumerable: true,
});
// ë°ë©´...
Object.defineProperty(o, "a", { value: 1 });
// ì ê²½ì° ìëì ê°ì
Object.defineProperty(o, "a", {
value: 1,
writable: false,
configurable: false,
enumerable: false,
});
ì¬ì©ì ì ì ì¤ì ìì ì ê·¼ì
ìë ìì ììë ì¤ì¤ë¡ ê°ì ë³í를 기ë¡íë ìì±ì 구íí©ëë¤. temperature
ìì±ì ê°ì í ë¹í ëë§ë¤ archive
ë°°ì´ì ê°ì´ ì¶ê°ë©ëë¤.
function Archiver() {
var temperature = null;
var archive = [];
Object.defineProperty(this, "temperature", {
get: function () {
console.log("get!");
return temperature;
},
set: function (value) {
temperature = value;
archive.push({ val: temperature });
},
});
this.getArchive = function () {
return archive;
};
}
var arc = new Archiver();
arc.temperature; // 'get!'
arc.temperature = 11;
arc.temperature = 13;
arc.getArchive(); // [{ val: 11 }, { val: 13 }]
ë¤ì ì½ëììë, ì ê·¼ìê° íì ê°ì ê°ì ë°íí©ëë¤.
var pattern = {
get() {
return "무ìì í ë¹í´ë íì ê°ì ê°ì ë°íí©ëë¤";
},
set() {
this.myname = "ë´ ì´ë¦";
},
};
function TestDefineSetAndGet() {
Object.defineProperty(this, "myproperty", pattern);
}
var instance = new TestDefineSetAndGet();
instance.myproperty = "test";
console.log(instance.myproperty);
// 무ìì í ë¹í´ë íì ê°ì ê°ì ë°íí©ëë¤
console.log(instance.myname); // ë´ ì´ë¦
ìì±ì ìì
ì ê·¼ì ìì±ì´ ììë ê²½ì°, ìì ê°ì²´ì ìì±ì ì ê·¼íê³ ìì í ë ë¶ëª¨ì ìì± get
ê³¼ set
ë©ìë를 í¸ì¶í©ëë¤. ìëì ê°ì´, ë ë©ìëê° ë°ê¹¥ ë³ìì ê°ì ì ì¥í ê²½ì° ëª¨ë ê°ì²´ ì¸ì¤í´ì¤ê° ê°ì ê³µì íê² ë©ëë¤.
function myclass() {}
var value;
Object.defineProperty(myclass.prototype, "x", {
get() {
return value;
},
set(x) {
value = x;
},
});
var a = new myclass();
var b = new myclass();
a.x = 1;
console.log(b.x); // 1
ì´ ë¬¸ì ë ê°ì ë¤ë¥¸ ìì±ì ì ì¥í´ì ìì í ì ììµëë¤. get
ê³¼ set
ë©ìëìì this
ë ìì±ì ì ê·¼íê±°ë ìì í ë ì¬ì©íë ê°ì²´ë¥¼ ê°ë¦¬íµëë¤.
function myclass() {}
Object.defineProperty(myclass.prototype, "x", {
get() {
return this.stored_x;
},
set(x) {
this.stored_x = x;
},
});
var a = new myclass();
var b = new myclass();
a.x = 1;
console.log(b.x); // undefined
ì ê·¼ì ìì±ê³¼ ë¬ë¦¬, ê° ìì±ì íë¡í íì ì´ ìë ê°ì²´ ìì²´ì ì¤ì ë©ëë¤. ê·¸ë¬ë ë¶ëª¨ì ì°ê¸° ë¶ê°ë¥í ìì±ì ììíë ê²½ì° ìì ê°ì²´ììë ê°ì ìì í ì ììµëë¤.
function myclass() {}
myclass.prototype.x = 1;
Object.defineProperty(myclass.prototype, "y", {
writable: false,
value: 1,
});
var a = new myclass();
a.x = 2;
console.log(a.x); // 2
console.log(myclass.prototype.x); // 1
a.y = 2; // 무ì, ì격 모ëììë ì¤ë¥
console.log(a.y); // 1
console.log(myclass.prototype.y); // 1
ëª
ì¸ ë¸ë¼ì°ì í¸íì± ê°ì´ 보기
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4