けいかく
38061 ワード
1.内部スロットと内部メソッドの定義
困難な定義😂)
より簡単な定義👍
[[...]]
で囲まれた名前は、内部スロットと内部メソッドです.2.内部スロットと内部方法の特徴
例を見て、難しい言葉を理解してみましょう.🔥
内部スロットとメソッドに直接アクセスできません.
const crew = { name: "lokba" };
console.dir(crew); //결과를 확인하면, [[Prototype]]이라는 내부 슬롯이 있다.
//ok, 좋아! [[Prototype]]에 접근해보자.
crew[[Prototype]]; //Uncaught SyntaxError: Unexpected token '['
//결론 : 내부 슬롯과 메서드에는 직접 접근을 할 수 없다!
一部の内部スロットと内部メソッドは間接的にアクセスできます!
const crew = { name: "lokba" };
//__proto__를 통해 [[Prototype]]에 접근할 수 있다.
console.log(crew.__proto__);
やめろ.
__proto__
は廃棄されました!このリンクを見てください.👁const crew = { name: "lokba" };
//__proto__와 동일한 결과를 반환해!
console.log(Object.getPrototypeOf(crew));
//결론: 앞으로, Object.getPrototypeOf()을 사용하세요!
3.PropertyツリーとPropertyディスク立棒オブジェクト
[[Value]]
[[Writable]]
[[Enumerable]]
[[Configurable]]
例題を見て、難しい言葉を理解してみましょう.🔥
crewオブジェクトのnameプロパティツリーにアクセスします.
const crew = { name: "lokba" };
crew[[Value]]; //Uncaught SyntaxError: Unexpected token '['
間違いない!property treviewは内部スロットなので直接アクセスできません.間接的に提供される
Object.getOwnPropertyDescriptor
メソッドを使用します!const crew = { name: "lokba" };
Object.getOwnPropertyDescriptor(crew, "name");
//{value: 'lokba', writable: true, enumerable: true, configurable: true}
// 오호, 프로퍼티 상태에는 value, writable, enumerable, configurable이 있군요!!
Object.getownPropertyDescriptorの方法をさらに理解しましょう.
프로퍼티 디스크립터 객체
を返す.また、ES 8はObjectを含む.getownPropertyDescriptorsメソッドを導入しました!これをどう使うか後で教えてあげます.😁)
const crew = { name: "lokba", description: "handsome" };
Object.getOwnPropertyDescriptors(crew);
//{name: {…}, description: {…}}
4.データリソースとアクセス者リソース
データプロバイダ
これまで見た例はすべてデータ・プロパティといえる.
もう一度見てみましょう.
const crew = { name: "lokba" };
Object.getOwnPropertyDescriptor(crew, "name");
//{value: 'lokba', writable: true, enumerable: true, configurable: true}
例に示すように、データ・プロパティには、次のプロパティ・レポートがあります.
[[Value]]
[[Writable]]
[[Enumerable]]
[[Configurable]]
訪問者の割合
例を見てみましょう.
const crew = {
name: "김상록",
nickname: "lokba",
get profile() {
return `name : ${this.name}, nickname : ${this.nickname}`;
},
set profile(value) {
[this.name, this.nickname] = value.split(" ");
},
};
Object.getOwnPropertyDescriptor(crew, "profile");
//enumerable: true, configurable: true, get: ƒ, set: ƒ}
例に示すように、ビジター・プロパティには次のプロパティ・ビューがあります.
[[Get]]
[[Set]]
[[Enumerable]]
[[Configurable]]
ほほほ、私はデータ番組と訪問者番組を学んで、ここで問題が発生しました.1~3号はどんな形で出力されますか?🤔
const crew = {
name: "김상록",
nickname: "lokba",
get profile() {
return `name : ${this.name}, nickname : ${this.nickname}`;
},
set profile(value) {
[this.name, this.nickname] = value.split(" ");
console.log(this);
},
getProfile() {
return `name : ${this.name}, nickname : ${this.nickname}`;
},
setProfile(value) {
[this.name, this.nickname] = value.split(" ");
console.log(this);
},
};
//1번(콘솔이 있다고 가정해주세요)
Object.getOwnPropertyDescriptor(crew, "getProfile");
//2번(콘솔이 있다고 가정해주세요)
Object.getOwnPropertyDescriptor(crew, "setProfile");
//3번(콘솔이 있다고 가정해주세요)
Object.getOwnPropertyDescriptor(crew, "profile");
正解
//1번
Object.getOwnPropertyDescriptor(crew, "getProfile");
//{writable: true, enumerable: true, configurable: true, value: ƒ}
//2번
Object.getOwnPropertyDescriptor(crew, "setProfile");
//{writable: true, enumerable: true, configurable: true, value: ƒ}
//3번
Object.getOwnPropertyDescriptor(crew, "profile");
//{enumerable: true, configurable: true, get: ƒ, set: ƒ}
5.プロパティの定義
Object.PropertyはdefinePropertyメソッドを使用して定義できます.
例を用いて、使用方法を理解します.
const crew = {};
Object.defineProperty(crew, "name", {
value: "lokba",
writable: true,
enumerable: true,
configurable: true,
});
Object.defineProperty(crew, "age", {
value: 26,
});
Object.getOwnPropertyDescriptor(crew, "name");
//{value: 'lokba', writable: true, enumerable: true, configurable: true}
Object.getOwnPropertyDescriptor(crew, "age");
//{value: 26, writable: false, enumerable: false, configurable: false}
Object.複数のプロパティを一度に定義するには、definePropertiesメソッドを使用します.
const crew = {};
Object.defineProperties(crew, {
name: {
value: "lokba",
writable: true,
enumerable: true,
configurable: true,
},
age: {
value: 26,
},
});
console.log(crew); //{name: 'lokba', age: 26}
Object.属性とオブジェクトを定義します.getownPropertyDescriptorsとのコラボレーション
const crew = { name: "lokba", description: "handsome" };
const copy = Object.defineProperties(
{},
Object.getOwnPropertyDescriptors(crew)
);
console.log(copy); //name: 'lokba', description: 'handsome'}
console.log(crew === copy); //false
6.オブジェクト変更の防止
時計だけ見て、理解できますが、もう少し詳しく調べてみましょう.
1.オブジェクトの展開を禁止-オブジェクト.preventExtensions()
拡張を禁止するオブジェクトはPropertyの追加を禁止します.
const person = { name: "Lee" };
// 아직, person 객체는 확장이 금지된 객체가 아니에요.
console.log(Object.isExtensible(person)); // true
// person 객체의 확장을 금지 적용!!
Object.preventExtensions(person);
// 이제, person 객체는 확장이 금지된 객체에요.
console.log(Object.isExtensible(person)); // false
// 프로퍼티 추가가 금지된다.
person.age = 20; // 무시. strict mode에서는 에러
console.log(person); // {name: "Lee"}
// 프로퍼티 정의에 의한 프로퍼티 추가도 금지된다.
Object.defineProperty(person, "age", { value: 20 });
// TypeError: Cannot define property age, object is not extensible
2.オブジェクトシール-オブジェクト.seal()
シールされたオブジェクトは読み書きのみです.
const person = { name: "Lee" };
// 아직, person 객체는 밀봉(seal)된 객체가 아니에요.
console.log(Object.isSealed(person)); // false
// person 객체를 밀봉 적용!!
Object.seal(person);
// 이제, person 객체는 밀봉(seal)된 객체에요.
console.log(Object.isSealed(person)); // true
// 프로퍼티 추가가 금지된다.
person.age = 20; // 무시. strict mode에서는 에러
console.log(person); // {name: "Lee"}
// 프로퍼티 삭제가 금지된다.
delete person.name; // 무시. strict mode에서는 에러
console.log(person); // {name: "Lee"}
3.オブジェクトをフリーズ-オブジェクト.freeze()
フリーズされたオブジェクトは読み取り専用です.
const person = { name: "Lee" };
// 아직, person 객체는 동결(freeze)된 객체가 아니에요.
console.log(Object.isFrozen(person)); // false
// person 객체를 동결 적용!!!
Object.freeze(person);
// 이제, person 객체는 동결(freeze)된 객체에요.
console.log(Object.isFrozen(person)); // true
// 프로퍼티 추가가 금지된다.
person.age = 20; // 무시. strict mode에서는 에러
console.log(person); // {name: "Lee"}
// 프로퍼티 삭제가 금지된다.
delete person.name; // 무시. strict mode에서는 에러
console.log(person); // {name: "Lee"}
// 프로퍼티 값 갱신이 금지된다.
person.name = "Kim"; // 무시. strict mode에서는 에러
console.log(person); // {name: "Lee"}
// 프로퍼티 어트리뷰트 재정의가 금지된다.
Object.defineProperty(person, "name", { configurable: true });
// TypeError: Cannot redefine property: name
4.不便な相手
これまで見た変更防止方法は、浅い変更を防止することです.
したがって、重複するオブジェクトに影響を与えることはできません.
const person = Object.freeze({
name: "Lee",
address: { city: "Seoul" },
});
console.log(Object.isFrozen(person)); // true
// 중첩 객체까지 동결하지 못해..
console.log(Object.isFrozen(person.address)); // false
person.address.city = "Busan";
console.log(person); // {name: "Lee", address: {city: "Busan"}}
ネストされたオブジェクトにも影響を与える場合は、オブジェクトを再帰的に選択します.freezeメソッドを呼び出すと、完璧な不変オブジェクトを実現できます.
Reference
この問題について(けいかく), 我々は、より多くの情報をここで見つけました https://velog.io/@lokba/프로퍼티-어트리뷰트テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol