4: ES6 객체 확장
전언
이 섹션에서는 ES6 제4장(확장된 대상 기능) 노트 이해
객체 범주
객체 범주는 다음과 같습니다.
Array
, Date
등.표준 대상은 일반일 수도 있고 기이할 수도 있다대상 서면량 문법의 확장
function createPerson(name, age) {
return {
name,
age
};
}
ES5 방법과 차이점: 방법은 간략하게 쓸 수 있다
super
. 간략하게 쓸 수 있는 방법이 아니라 사용할 수 없다.var person = {
name: "Nicholas",
// ,
sayName() {
console.log(this.name);
}
};
var person = {},
lastName = "last name";
person["first name"] = "Nicholas";
person[lastName] = "Zakas";
console.log(person["first name"]); // "Nicholas"
console.log(person[lastName]); // "Zakas"
// === ES5 ===
var person = {
[lastName]:'Zakas'
}
person["first" + suffix];
var lastName = "last name";
var suffix = " name";
var person = {
"first name": "Nicholas",
[lastName]: "Zakas",
["first" + suffix]: "Nicholas",
};
console.log(person["first name"]); // "Nicholas"
console.log(person[lastName]); // "Zakas"
새로운 방법
ES5는 ES5부터 새로운 전역 함수를 만드는 것을 피하고 Object 대상의 원형에 새로운 방법을 추가하는 것을 피하며 어떤 대상이 새로운 방법을 추가해야 하는지를 찾으려는 설계 의도를 가지고 있다.따라서 다른 객체에 적용되지 않는 새 메서드는 전체 Object 객체에 추가됩니다.
엄격하게 동일 연산자(==)는 +0과 -0이 같거나 NaN===NaN이false를 반환하는 것으로 간주됩니다.
Object.is()
는 이러한 특수한 표현을 복원했다console.log(+0 == -0); // true
console.log(+0 === -0); // true
console.log(Object.is(+0, -0)); // false
console.log(NaN == NaN); // false
console.log(NaN === NaN); // false
console.log(Object.is(NaN, NaN)); // true
console.log(5 == 5); // true
console.log(5 == "5"); // true
console.log(5 === 5); // true
console.log(5 === "5"); // false
console.log(Object.is(5, 5)); // true
console.log(Object.is(5, "5")); // false
get
var receiver = {};
Object.assign(receiver,
{
type: "js",
name: "file.js"
},
// ,
{
type: "css"
}
);
console.log(receiver.type); // "css"
console.log(receiver.name); // "file.js"
// === ===
var receiver = {},
supplier = {
get name() {
return "file.js"
}
};
Object.assign(receiver, supplier);
var descriptor = Object.getOwnPropertyDescriptor(receiver, "name");
console.log(descriptor.value); // "file.js"
console.log(descriptor.get); // undefined
중복 객체 글꼴 속성
고유 속성의 열거 순서
ES5
에서는 대상 속성의 매거 순서를 정의하지 않았고, ES6에서는 대상 자체 속성이 매거될 때 되돌아오는 순서를 엄격하게 정의했다.고유 속성이 열거될 때 기본 순서는 다음과 같습니다.
var obj = {
a: 1,
0: 1,
c: 1,
2: 1,
b: 1,
1: 1
};
obj.d = 1;
console.log(Object.getOwnPropertyNames(obj).join("")); // "012acbd"
이것은 Object입니다.getOwnPropertyNames() 및 Reflect.ownKeys(제12장 참조)는 속성이 어떻게 되돌아오는지에 영향을 미쳤고 Object에도 영향을 미쳤다.assign () 처리 속성의 순서입니다.
for-in 순환의 매거 순서는 아직 명확하게 정해지지 않았다. 왜냐하면 모든 JS 엔진이 같은 방식을 사용하는 것은 아니기 때문이다.Object.keys() 및 JSON.stringify () 도 for-in과 같은 매거 순서를 사용합니다.
더욱 강력한 원형
Object.create()
방법을 통해) 변하지 않는다.Object.setPrototypeOf()
방법을 추가하여 임의로 지정한 대상의 원형을 수정할 수 있습니다.ES6의 Object.setPrototypeOf () 방법은 대상이 만들어진 후에 원형을 변경할 수 있습니다.
// : , .
let person = {
getGreeting() {
return "Hello";
}
};
let dog = {
getGreeting() {
return "Woof";
}
};
// person
let friend = Object.create(person);
console.log(friend.getGreeting()); // "Hello"
console.log(Object.getPrototypeOf(friend) === person); // true
let person = {
getGreeting() {
return "Hello";
}
};
let dog = {
getGreeting() {
return "Woof";
}
};
let friend = {
getGreeting() {
// , , call this
return Object.getPrototypeOf(this).getGreeting.call(this) + ", hi!";
}
};
// person
Object.setPrototypeOf(friend, person);
console.log(friend.getGreeting()); // "Hello, hi!"
console.log(Object.getPrototypeOf(friend) === person); // true
그러나 다단계 계승 시 이 방법은 적용되지 않는다let person = {
getGreeting() {
return "Hello";
}
};
// person
let friend = {
getGreeting() {
// , this relative , relative friend , friend.getGreeting().call() , 。
return Object.getPrototypeOf(this).getGreeting.call(this) + ", hi!";
}
};
Object.setPrototypeOf(friend, person);
// friend
let relative = Object.create(friend);
console.log(person.getGreeting()); // "Hello"
console.log(friend.getGreeting()); // "Hello, hi!"
console.log(relative.getGreeting()); // error!
super
인용은 현재 대상의 원형을 가리키는 지침이고 super
는 동적이 아니다. 항상 정확한 대상을 가리킬 수 있다. 슈퍼 인용은 호출할 때 확정된 것이 아니라 대상(대상의 방법에 따라 간략하게 쓰고class 문법에 사용해야 한다)의 원형이다. 시종 현재 대상의 원형은 방법을 간략하게 쓸 수 없는 상황에서 사용할 수 없다super
.문법 오류 발생let person = {
getGreeting() {
return "Hello";
}
};
// person
let friend = {
getGreeting() {
// super (friend) , this
return super.getGreeting() + ", hi!";
}
};
Object.setPrototypeOf(friend, person);
// friend
let relative = Object.create(friend);
console.log(person.getGreeting()); // "Hello"
console.log(friend.getGreeting()); // "Hello, hi!"
console.log(relative.getGreeting()); // "Hello, hi!"
공식적인 메서드 정의
[[HomeObject]]
내부 속성을 가진 함수로 이 내부 속성은 이 방법이 속한 대상을 가리킨다super
에 대한 인용은 [[HomeObject]]
속성을 사용하여 무엇을 해야 할지 판단합니다.첫 번째 단계는 [[HomeObject]]
에서 Object.getPrototypeOf()
를 호출하여 원형에 대한 인용을 얻는 것이다.다음에 이 원형에서 동명 함수를 찾기;마지막으로 this
귀속을 만들고 이 방법을 호출합니다.let person = {
//
getGreeting() {
return "Hello";
}
};
//
function shareGreeting() {
return "Hi!";
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.