Get set helpers (#7687)
* Improve get/set helper
* fixtures
* Edge cases
* Add loose edge cases
* Spec compliant
* Add issue case
* Even more edge cases!
* Final updates
* Fix name
* Use Reflect.{get, set} when available
* Avoid block scoping in loose
* Remove semicolon
* Do not redefine a non-enumerable
* Get strictness from call site, not helpers
* Add called assertions
* Classes are always strict
* Update test fixture
This commit is contained in:
@@ -0,0 +1,16 @@
|
||||
"use strict";
|
||||
const Base = {
|
||||
test: 1,
|
||||
};
|
||||
|
||||
const obj = {
|
||||
test: 2,
|
||||
|
||||
get() {
|
||||
return super.test;
|
||||
},
|
||||
};
|
||||
Object.setPrototypeOf(obj, Base);
|
||||
|
||||
assert.equal(obj.test, 2);
|
||||
assert.equal(obj.get(), 1);
|
||||
@@ -0,0 +1,16 @@
|
||||
"use strict";
|
||||
const Base = {
|
||||
test: 1,
|
||||
};
|
||||
|
||||
const obj = {
|
||||
test: 2,
|
||||
|
||||
get() {
|
||||
return super.test;
|
||||
},
|
||||
};
|
||||
Object.setPrototypeOf(obj, Base);
|
||||
|
||||
assert.equal(obj.test, 2);
|
||||
assert.equal(obj.get(), 1);
|
||||
@@ -0,0 +1,24 @@
|
||||
"use strict";
|
||||
|
||||
var _obj;
|
||||
|
||||
function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); }
|
||||
|
||||
function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; }
|
||||
|
||||
function _getPrototypeOf(o) { _getPrototypeOf = Object.getPrototypeOf || function _getPrototypeOf(o) { return o.__proto__; }; return _getPrototypeOf(o); }
|
||||
|
||||
const Base = {
|
||||
test: 1
|
||||
};
|
||||
const obj = _obj = {
|
||||
test: 2,
|
||||
|
||||
get() {
|
||||
return _get(_getPrototypeOf(_obj), "test", this);
|
||||
}
|
||||
|
||||
};
|
||||
Object.setPrototypeOf(obj, Base);
|
||||
assert.equal(obj.test, 2);
|
||||
assert.equal(obj.get(), 1);
|
||||
@@ -0,0 +1,19 @@
|
||||
"use strict";
|
||||
const Base = {
|
||||
get test() {
|
||||
assert.equal(this, obj);
|
||||
return 1;
|
||||
}
|
||||
};
|
||||
|
||||
const obj = {
|
||||
test: 2,
|
||||
|
||||
get() {
|
||||
return super.test;
|
||||
},
|
||||
};
|
||||
Object.setPrototypeOf(obj, Base);
|
||||
|
||||
assert.equal(obj.test, 2);
|
||||
assert.equal(obj.get(), 1);
|
||||
@@ -0,0 +1,19 @@
|
||||
"use strict";
|
||||
const Base = {
|
||||
get test() {
|
||||
assert.equal(this, obj);
|
||||
return 1;
|
||||
}
|
||||
};
|
||||
|
||||
const obj = {
|
||||
test: 2,
|
||||
|
||||
get() {
|
||||
return super.test;
|
||||
},
|
||||
};
|
||||
Object.setPrototypeOf(obj, Base);
|
||||
|
||||
assert.equal(obj.test, 2);
|
||||
assert.equal(obj.get(), 1);
|
||||
@@ -0,0 +1,28 @@
|
||||
"use strict";
|
||||
|
||||
var _obj;
|
||||
|
||||
function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); }
|
||||
|
||||
function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; }
|
||||
|
||||
function _getPrototypeOf(o) { _getPrototypeOf = Object.getPrototypeOf || function _getPrototypeOf(o) { return o.__proto__; }; return _getPrototypeOf(o); }
|
||||
|
||||
const Base = {
|
||||
get test() {
|
||||
assert.equal(this, obj);
|
||||
return 1;
|
||||
}
|
||||
|
||||
};
|
||||
const obj = _obj = {
|
||||
test: 2,
|
||||
|
||||
get() {
|
||||
return _get(_getPrototypeOf(_obj), "test", this);
|
||||
}
|
||||
|
||||
};
|
||||
Object.setPrototypeOf(obj, Base);
|
||||
assert.equal(obj.test, 2);
|
||||
assert.equal(obj.get(), 1);
|
||||
@@ -0,0 +1,15 @@
|
||||
"use strict";
|
||||
const Base = {
|
||||
};
|
||||
|
||||
const obj = {
|
||||
test: 2,
|
||||
|
||||
get() {
|
||||
return super.test;
|
||||
},
|
||||
};
|
||||
Object.setPrototypeOf(obj, Base);
|
||||
|
||||
assert.equal(obj.test, 2);
|
||||
assert.equal(obj.get(), undefined);
|
||||
@@ -0,0 +1,15 @@
|
||||
"use strict";
|
||||
const Base = {
|
||||
};
|
||||
|
||||
const obj = {
|
||||
test: 2,
|
||||
|
||||
get() {
|
||||
return super.test;
|
||||
},
|
||||
};
|
||||
Object.setPrototypeOf(obj, Base);
|
||||
|
||||
assert.equal(obj.test, 2);
|
||||
assert.equal(obj.get(), undefined);
|
||||
@@ -0,0 +1,22 @@
|
||||
"use strict";
|
||||
|
||||
var _obj;
|
||||
|
||||
function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); }
|
||||
|
||||
function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; }
|
||||
|
||||
function _getPrototypeOf(o) { _getPrototypeOf = Object.getPrototypeOf || function _getPrototypeOf(o) { return o.__proto__; }; return _getPrototypeOf(o); }
|
||||
|
||||
const Base = {};
|
||||
const obj = _obj = {
|
||||
test: 2,
|
||||
|
||||
get() {
|
||||
return _get(_getPrototypeOf(_obj), "test", this);
|
||||
}
|
||||
|
||||
};
|
||||
Object.setPrototypeOf(obj, Base);
|
||||
assert.equal(obj.test, 2);
|
||||
assert.equal(obj.get(), undefined);
|
||||
@@ -0,0 +1,18 @@
|
||||
"use strict";
|
||||
const Base = {
|
||||
set test(v) {
|
||||
throw new Error("not called");
|
||||
}
|
||||
};
|
||||
|
||||
const obj = {
|
||||
test: 2,
|
||||
|
||||
get() {
|
||||
return super.test;
|
||||
},
|
||||
};
|
||||
Object.setPrototypeOf(obj, Base);
|
||||
|
||||
assert.equal(obj.test, 2);
|
||||
assert.equal(obj.get(), undefined);
|
||||
@@ -0,0 +1,18 @@
|
||||
"use strict";
|
||||
const Base = {
|
||||
set test(v) {
|
||||
throw new Error("not called");
|
||||
}
|
||||
};
|
||||
|
||||
const obj = {
|
||||
test: 2,
|
||||
|
||||
get() {
|
||||
return super.test;
|
||||
},
|
||||
};
|
||||
Object.setPrototypeOf(obj, Base);
|
||||
|
||||
assert.equal(obj.test, 2);
|
||||
assert.equal(obj.get(), undefined);
|
||||
@@ -0,0 +1,27 @@
|
||||
"use strict";
|
||||
|
||||
var _obj;
|
||||
|
||||
function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); }
|
||||
|
||||
function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; }
|
||||
|
||||
function _getPrototypeOf(o) { _getPrototypeOf = Object.getPrototypeOf || function _getPrototypeOf(o) { return o.__proto__; }; return _getPrototypeOf(o); }
|
||||
|
||||
const Base = {
|
||||
set test(v) {
|
||||
throw new Error("not called");
|
||||
}
|
||||
|
||||
};
|
||||
const obj = _obj = {
|
||||
test: 2,
|
||||
|
||||
get() {
|
||||
return _get(_getPrototypeOf(_obj), "test", this);
|
||||
}
|
||||
|
||||
};
|
||||
Object.setPrototypeOf(obj, Base);
|
||||
assert.equal(obj.test, 2);
|
||||
assert.equal(obj.get(), undefined);
|
||||
4
packages/babel-plugin-transform-object-super/test/fixtures/get-set/options.json
vendored
Normal file
4
packages/babel-plugin-transform-object-super/test/fixtures/get-set/options.json
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"minNodeVersion": "6.0.0",
|
||||
"plugins": ["transform-object-super"]
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
"use strict";
|
||||
const Base = {
|
||||
test: 1,
|
||||
};
|
||||
|
||||
const obj = {
|
||||
test: 2,
|
||||
|
||||
set() {
|
||||
return super.test = 3;
|
||||
},
|
||||
};
|
||||
Object.setPrototypeOf(obj, Base);
|
||||
|
||||
assert.equal(obj.set(), 3);
|
||||
assert.equal(Base.test, 1);
|
||||
assert.equal(obj.test, 3);
|
||||
@@ -0,0 +1,17 @@
|
||||
"use strict";
|
||||
const Base = {
|
||||
test: 1,
|
||||
};
|
||||
|
||||
const obj = {
|
||||
test: 2,
|
||||
|
||||
set() {
|
||||
return super.test = 3;
|
||||
},
|
||||
};
|
||||
Object.setPrototypeOf(obj, Base);
|
||||
|
||||
assert.equal(obj.set(), 3);
|
||||
assert.equal(Base.test, 3);
|
||||
assert.equal(obj.test, 2);
|
||||
@@ -0,0 +1,29 @@
|
||||
"use strict";
|
||||
|
||||
var _obj;
|
||||
|
||||
function set(target, property, value, receiver) { if (typeof Reflect !== "undefined" && Reflect.set) { set = Reflect.set; } else { set = function set(target, property, value, receiver) { var base = _superPropBase(target, property); var desc; if (base) { desc = Object.getOwnPropertyDescriptor(base, property); if (desc.set) { desc.set.call(receiver, value); return true; } else if (!desc.writable) { return false; } } desc = Object.getOwnPropertyDescriptor(receiver, property); if (desc) { if (!desc.writable) { return false; } desc.value = value; Object.defineProperty(receiver, property, desc); } else { _defineProperty(receiver, property, value); } return true; }; } return set(target, property, value, receiver); }
|
||||
|
||||
function _set(target, property, value, receiver, isStrict) { const s = set(target, property, value, receiver || target); if (!s && isStrict) { throw new Error('failed to set property'); } return value; }
|
||||
|
||||
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||||
|
||||
function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; }
|
||||
|
||||
function _getPrototypeOf(o) { _getPrototypeOf = Object.getPrototypeOf || function _getPrototypeOf(o) { return o.__proto__; }; return _getPrototypeOf(o); }
|
||||
|
||||
const Base = {
|
||||
test: 1
|
||||
};
|
||||
const obj = _obj = {
|
||||
test: 2,
|
||||
|
||||
set() {
|
||||
return _set(_getPrototypeOf(_obj), "test", 3, this, true);
|
||||
}
|
||||
|
||||
};
|
||||
Object.setPrototypeOf(obj, Base);
|
||||
assert.equal(obj.set(), 3);
|
||||
assert.equal(Base.test, 3);
|
||||
assert.equal(obj.test, 2);
|
||||
@@ -0,0 +1,21 @@
|
||||
"use strict";
|
||||
const Base = {
|
||||
};
|
||||
Object.defineProperty(Base, 'test', {
|
||||
value: 1,
|
||||
writable: true,
|
||||
configurable: false,
|
||||
});
|
||||
|
||||
const obj = {
|
||||
test: 2,
|
||||
|
||||
set() {
|
||||
return super.test = 3;
|
||||
},
|
||||
};
|
||||
Object.setPrototypeOf(obj, Base);
|
||||
|
||||
assert.equal(obj.set(), 3);
|
||||
assert.equal(Base.test, 1);
|
||||
assert.equal(obj.test, 3);
|
||||
@@ -0,0 +1,20 @@
|
||||
var Base = {
|
||||
};
|
||||
Object.defineProperty(Base, 'test', {
|
||||
value: 1,
|
||||
writable: false,
|
||||
configurable: true,
|
||||
});
|
||||
|
||||
var obj = {
|
||||
test: 2,
|
||||
|
||||
set() {
|
||||
return super.test = 3;
|
||||
},
|
||||
};
|
||||
Object.setPrototypeOf(obj, Base);
|
||||
|
||||
assert.equal(obj.set(), 3);
|
||||
assert.equal(Base.test, 1);
|
||||
assert.equal(obj.test, 2);
|
||||
@@ -0,0 +1,23 @@
|
||||
"use strict";
|
||||
const Base = {
|
||||
};
|
||||
Object.defineProperty(Base, 'test', {
|
||||
value: 1,
|
||||
writable: false,
|
||||
configurable: true,
|
||||
});
|
||||
|
||||
const obj = {
|
||||
test: 2,
|
||||
|
||||
set() {
|
||||
return super.test = 3;
|
||||
},
|
||||
};
|
||||
Object.setPrototypeOf(obj, Base);
|
||||
|
||||
assert.throws(() => {
|
||||
obj.set();
|
||||
});
|
||||
assert.equal(Base.test, 1);
|
||||
assert.equal(obj.test, 2);
|
||||
@@ -0,0 +1,24 @@
|
||||
"use strict";
|
||||
let called = false;
|
||||
const Base = {
|
||||
get test() {
|
||||
called = true;
|
||||
return 1;
|
||||
}
|
||||
};
|
||||
|
||||
const obj = {
|
||||
test: 2,
|
||||
|
||||
set() {
|
||||
return super.test = 3;
|
||||
},
|
||||
};
|
||||
Object.setPrototypeOf(obj, Base);
|
||||
|
||||
assert.throws(() => {
|
||||
obj.set();
|
||||
});
|
||||
assert.equal(called, false);
|
||||
assert.equal(Base.test, 1);
|
||||
assert.equal(obj.test, 2);
|
||||
@@ -0,0 +1,23 @@
|
||||
"use strict";
|
||||
const Base = {
|
||||
get test() {
|
||||
return 1;
|
||||
}
|
||||
};
|
||||
|
||||
const obj = {
|
||||
test: 2,
|
||||
|
||||
set() {
|
||||
return super.test = 3;
|
||||
},
|
||||
};
|
||||
Object.setPrototypeOf(obj, Base);
|
||||
|
||||
assert.throws(() => {
|
||||
// this requires helpers to be in file (not external), so they
|
||||
// are in "strict" mode code.
|
||||
obj.set();
|
||||
});
|
||||
assert.equal(Base.test, 1);
|
||||
assert.equal(obj.test, 2);
|
||||
@@ -0,0 +1,36 @@
|
||||
"use strict";
|
||||
|
||||
var _obj;
|
||||
|
||||
function set(target, property, value, receiver) { if (typeof Reflect !== "undefined" && Reflect.set) { set = Reflect.set; } else { set = function set(target, property, value, receiver) { var base = _superPropBase(target, property); var desc; if (base) { desc = Object.getOwnPropertyDescriptor(base, property); if (desc.set) { desc.set.call(receiver, value); return true; } else if (!desc.writable) { return false; } } desc = Object.getOwnPropertyDescriptor(receiver, property); if (desc) { if (!desc.writable) { return false; } desc.value = value; Object.defineProperty(receiver, property, desc); } else { _defineProperty(receiver, property, value); } return true; }; } return set(target, property, value, receiver); }
|
||||
|
||||
function _set(target, property, value, receiver, isStrict) { const s = set(target, property, value, receiver || target); if (!s && isStrict) { throw new Error('failed to set property'); } return value; }
|
||||
|
||||
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||||
|
||||
function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; }
|
||||
|
||||
function _getPrototypeOf(o) { _getPrototypeOf = Object.getPrototypeOf || function _getPrototypeOf(o) { return o.__proto__; }; return _getPrototypeOf(o); }
|
||||
|
||||
const Base = {
|
||||
get test() {
|
||||
return 1;
|
||||
}
|
||||
|
||||
};
|
||||
const obj = _obj = {
|
||||
test: 2,
|
||||
|
||||
set() {
|
||||
return _set(_getPrototypeOf(_obj), "test", 3, this, true);
|
||||
}
|
||||
|
||||
};
|
||||
Object.setPrototypeOf(obj, Base);
|
||||
assert.throws(() => {
|
||||
// this requires helpers to be in file (not external), so they
|
||||
// are in "strict" mode code.
|
||||
obj.set();
|
||||
});
|
||||
assert.equal(Base.test, 1);
|
||||
assert.equal(obj.test, 2);
|
||||
@@ -0,0 +1,25 @@
|
||||
"use strict";
|
||||
const Base = {
|
||||
};
|
||||
|
||||
const obj = {
|
||||
set() {
|
||||
return super.test = 3;
|
||||
},
|
||||
};
|
||||
Object.defineProperty(obj, 'test', {
|
||||
value: 2,
|
||||
writable: true,
|
||||
configurable: false,
|
||||
enumerable: true,
|
||||
});
|
||||
Object.setPrototypeOf(obj, Base);
|
||||
|
||||
assert.equal(obj.set(), 3);
|
||||
assert.equal(Base.test, undefined);
|
||||
assert.equal(obj.test, 3);
|
||||
|
||||
const desc = Object.getOwnPropertyDescriptor(obj, 'test');
|
||||
assert.equal(desc.configurable, false);
|
||||
assert.equal(desc.writable, true);
|
||||
assert.equal(desc.enumerable, true);
|
||||
@@ -0,0 +1,25 @@
|
||||
"use strict";
|
||||
const Base = {
|
||||
};
|
||||
|
||||
const obj = {
|
||||
set() {
|
||||
return super.test = 3;
|
||||
},
|
||||
};
|
||||
Object.defineProperty(obj, 'test', {
|
||||
value: 2,
|
||||
writable: true,
|
||||
configurable: false,
|
||||
enumerable: true,
|
||||
});
|
||||
Object.setPrototypeOf(obj, Base);
|
||||
|
||||
assert.equal(obj.set(), 3);
|
||||
assert.equal(Base.test, undefined);
|
||||
assert.equal(obj.test, 3);
|
||||
|
||||
const desc = Object.getOwnPropertyDescriptor(obj, 'test');
|
||||
assert.equal(desc.configurable, false);
|
||||
assert.equal(desc.writable, true);
|
||||
assert.equal(desc.enumerable, true);
|
||||
@@ -0,0 +1,35 @@
|
||||
"use strict";
|
||||
|
||||
var _obj;
|
||||
|
||||
function set(target, property, value, receiver) { if (typeof Reflect !== "undefined" && Reflect.set) { set = Reflect.set; } else { set = function set(target, property, value, receiver) { var base = _superPropBase(target, property); var desc; if (base) { desc = Object.getOwnPropertyDescriptor(base, property); if (desc.set) { desc.set.call(receiver, value); return true; } else if (!desc.writable) { return false; } } desc = Object.getOwnPropertyDescriptor(receiver, property); if (desc) { if (!desc.writable) { return false; } desc.value = value; Object.defineProperty(receiver, property, desc); } else { _defineProperty(receiver, property, value); } return true; }; } return set(target, property, value, receiver); }
|
||||
|
||||
function _set(target, property, value, receiver, isStrict) { const s = set(target, property, value, receiver || target); if (!s && isStrict) { throw new Error('failed to set property'); } return value; }
|
||||
|
||||
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||||
|
||||
function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; }
|
||||
|
||||
function _getPrototypeOf(o) { _getPrototypeOf = Object.getPrototypeOf || function _getPrototypeOf(o) { return o.__proto__; }; return _getPrototypeOf(o); }
|
||||
|
||||
const Base = {};
|
||||
const obj = _obj = {
|
||||
set() {
|
||||
return _set(_getPrototypeOf(_obj), "test", 3, this, true);
|
||||
}
|
||||
|
||||
};
|
||||
Object.defineProperty(obj, 'test', {
|
||||
value: 2,
|
||||
writable: true,
|
||||
configurable: false,
|
||||
enumerable: true
|
||||
});
|
||||
Object.setPrototypeOf(obj, Base);
|
||||
assert.equal(obj.set(), 3);
|
||||
assert.equal(Base.test, undefined);
|
||||
assert.equal(obj.test, 3);
|
||||
const desc = Object.getOwnPropertyDescriptor(obj, 'test');
|
||||
assert.equal(desc.configurable, false);
|
||||
assert.equal(desc.writable, true);
|
||||
assert.equal(desc.enumerable, true);
|
||||
@@ -0,0 +1,25 @@
|
||||
"use strict";
|
||||
const Base = {
|
||||
};
|
||||
|
||||
const obj = {
|
||||
set() {
|
||||
return super.test = 3;
|
||||
},
|
||||
};
|
||||
Object.defineProperty(obj, 'test', {
|
||||
value: 2,
|
||||
writable: true,
|
||||
configurable: true,
|
||||
enumerable: false,
|
||||
});
|
||||
Object.setPrototypeOf(obj, Base);
|
||||
|
||||
assert.equal(obj.set(), 3);
|
||||
assert.equal(Base.test, undefined);
|
||||
assert.equal(obj.test, 3);
|
||||
|
||||
const desc = Object.getOwnPropertyDescriptor(obj, 'test');
|
||||
assert.equal(desc.configurable, true);
|
||||
assert.equal(desc.writable, true);
|
||||
assert.equal(desc.enumerable, false);
|
||||
@@ -0,0 +1,25 @@
|
||||
"use strict";
|
||||
const Base = {
|
||||
};
|
||||
|
||||
const obj = {
|
||||
set() {
|
||||
return super.test = 3;
|
||||
},
|
||||
};
|
||||
Object.defineProperty(obj, 'test', {
|
||||
value: 2,
|
||||
writable: true,
|
||||
configurable: true,
|
||||
enumerable: false,
|
||||
});
|
||||
Object.setPrototypeOf(obj, Base);
|
||||
|
||||
assert.equal(obj.set(), 3);
|
||||
assert.equal(Base.test, undefined);
|
||||
assert.equal(obj.test, 3);
|
||||
|
||||
const desc = Object.getOwnPropertyDescriptor(obj, 'test');
|
||||
assert.equal(desc.configurable, true);
|
||||
assert.equal(desc.writable, true);
|
||||
assert.equal(desc.enumerable, false);
|
||||
@@ -0,0 +1,35 @@
|
||||
"use strict";
|
||||
|
||||
var _obj;
|
||||
|
||||
function set(target, property, value, receiver) { if (typeof Reflect !== "undefined" && Reflect.set) { set = Reflect.set; } else { set = function set(target, property, value, receiver) { var base = _superPropBase(target, property); var desc; if (base) { desc = Object.getOwnPropertyDescriptor(base, property); if (desc.set) { desc.set.call(receiver, value); return true; } else if (!desc.writable) { return false; } } desc = Object.getOwnPropertyDescriptor(receiver, property); if (desc) { if (!desc.writable) { return false; } desc.value = value; Object.defineProperty(receiver, property, desc); } else { _defineProperty(receiver, property, value); } return true; }; } return set(target, property, value, receiver); }
|
||||
|
||||
function _set(target, property, value, receiver, isStrict) { const s = set(target, property, value, receiver || target); if (!s && isStrict) { throw new Error('failed to set property'); } return value; }
|
||||
|
||||
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||||
|
||||
function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; }
|
||||
|
||||
function _getPrototypeOf(o) { _getPrototypeOf = Object.getPrototypeOf || function _getPrototypeOf(o) { return o.__proto__; }; return _getPrototypeOf(o); }
|
||||
|
||||
const Base = {};
|
||||
const obj = _obj = {
|
||||
set() {
|
||||
return _set(_getPrototypeOf(_obj), "test", 3, this, true);
|
||||
}
|
||||
|
||||
};
|
||||
Object.defineProperty(obj, 'test', {
|
||||
value: 2,
|
||||
writable: true,
|
||||
configurable: true,
|
||||
enumerable: false
|
||||
});
|
||||
Object.setPrototypeOf(obj, Base);
|
||||
assert.equal(obj.set(), 3);
|
||||
assert.equal(Base.test, undefined);
|
||||
assert.equal(obj.test, 3);
|
||||
const desc = Object.getOwnPropertyDescriptor(obj, 'test');
|
||||
assert.equal(desc.configurable, true);
|
||||
assert.equal(desc.writable, true);
|
||||
assert.equal(desc.enumerable, false);
|
||||
@@ -0,0 +1,24 @@
|
||||
var Base = {
|
||||
};
|
||||
|
||||
var obj = {
|
||||
set() {
|
||||
return super.test = 3;
|
||||
},
|
||||
};
|
||||
Object.defineProperty(obj, 'test', {
|
||||
value: 2,
|
||||
writable: false,
|
||||
configurable: true,
|
||||
enumerable: true,
|
||||
});
|
||||
Object.setPrototypeOf(obj, Base);
|
||||
|
||||
assert.equal(obj.set(), 3);
|
||||
assert.equal(Base.test, undefined);
|
||||
assert.equal(obj.test, 2);
|
||||
|
||||
const desc = Object.getOwnPropertyDescriptor(obj, 'test');
|
||||
assert.equal(desc.configurable, true);
|
||||
assert.equal(desc.writable, false);
|
||||
assert.equal(desc.enumerable, true);
|
||||
@@ -0,0 +1,27 @@
|
||||
"use strict";
|
||||
const Base = {
|
||||
};
|
||||
|
||||
const obj = {
|
||||
set() {
|
||||
return super.test = 3;
|
||||
},
|
||||
};
|
||||
Object.defineProperty(obj, 'test', {
|
||||
value: 2,
|
||||
writable: false,
|
||||
configurable: true,
|
||||
enumerable: true,
|
||||
});
|
||||
Object.setPrototypeOf(obj, Base);
|
||||
|
||||
assert.throws(() => {
|
||||
obj.set();
|
||||
});
|
||||
assert.equal(Base.test, undefined);
|
||||
assert.equal(obj.test, 2);
|
||||
|
||||
const desc = Object.getOwnPropertyDescriptor(obj, 'test');
|
||||
assert.equal(desc.configurable, true);
|
||||
assert.equal(desc.writable, false);
|
||||
assert.equal(desc.enumerable, true);
|
||||
@@ -0,0 +1,27 @@
|
||||
"use strict";
|
||||
const Base = {
|
||||
};
|
||||
|
||||
const obj = {
|
||||
set() {
|
||||
return super.test = 3;
|
||||
},
|
||||
};
|
||||
Object.defineProperty(obj, 'test', {
|
||||
value: 2,
|
||||
writable: false,
|
||||
configurable: true,
|
||||
enumerable: true,
|
||||
});
|
||||
Object.setPrototypeOf(obj, Base);
|
||||
|
||||
assert.throws(() => {
|
||||
obj.set();
|
||||
});
|
||||
assert.equal(Base.test, undefined);
|
||||
assert.equal(obj.test, 2);
|
||||
|
||||
const desc = Object.getOwnPropertyDescriptor(obj, 'test');
|
||||
assert.equal(desc.configurable, true);
|
||||
assert.equal(desc.writable, false);
|
||||
assert.equal(desc.enumerable, true);
|
||||
@@ -0,0 +1,37 @@
|
||||
"use strict";
|
||||
|
||||
var _obj;
|
||||
|
||||
function set(target, property, value, receiver) { if (typeof Reflect !== "undefined" && Reflect.set) { set = Reflect.set; } else { set = function set(target, property, value, receiver) { var base = _superPropBase(target, property); var desc; if (base) { desc = Object.getOwnPropertyDescriptor(base, property); if (desc.set) { desc.set.call(receiver, value); return true; } else if (!desc.writable) { return false; } } desc = Object.getOwnPropertyDescriptor(receiver, property); if (desc) { if (!desc.writable) { return false; } desc.value = value; Object.defineProperty(receiver, property, desc); } else { _defineProperty(receiver, property, value); } return true; }; } return set(target, property, value, receiver); }
|
||||
|
||||
function _set(target, property, value, receiver, isStrict) { const s = set(target, property, value, receiver || target); if (!s && isStrict) { throw new Error('failed to set property'); } return value; }
|
||||
|
||||
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||||
|
||||
function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; }
|
||||
|
||||
function _getPrototypeOf(o) { _getPrototypeOf = Object.getPrototypeOf || function _getPrototypeOf(o) { return o.__proto__; }; return _getPrototypeOf(o); }
|
||||
|
||||
const Base = {};
|
||||
const obj = _obj = {
|
||||
set() {
|
||||
return _set(_getPrototypeOf(_obj), "test", 3, this, true);
|
||||
}
|
||||
|
||||
};
|
||||
Object.defineProperty(obj, 'test', {
|
||||
value: 2,
|
||||
writable: false,
|
||||
configurable: true,
|
||||
enumerable: true
|
||||
});
|
||||
Object.setPrototypeOf(obj, Base);
|
||||
assert.throws(() => {
|
||||
obj.set();
|
||||
});
|
||||
assert.equal(Base.test, undefined);
|
||||
assert.equal(obj.test, 2);
|
||||
const desc = Object.getOwnPropertyDescriptor(obj, 'test');
|
||||
assert.equal(desc.configurable, true);
|
||||
assert.equal(desc.writable, false);
|
||||
assert.equal(desc.enumerable, true);
|
||||
@@ -0,0 +1,16 @@
|
||||
"use strict";
|
||||
const Base = {
|
||||
};
|
||||
|
||||
const obj = {
|
||||
test: 2,
|
||||
|
||||
set() {
|
||||
return super.test = 3;
|
||||
},
|
||||
};
|
||||
Object.setPrototypeOf(obj, Base);
|
||||
|
||||
assert.equal(obj.set(), 3);
|
||||
assert.equal(Base.test, undefined);
|
||||
assert.equal(obj.test, 3);
|
||||
@@ -0,0 +1,16 @@
|
||||
"use strict";
|
||||
const Base = {
|
||||
};
|
||||
|
||||
const obj = {
|
||||
test: 2,
|
||||
|
||||
set() {
|
||||
return super.test = 3;
|
||||
},
|
||||
};
|
||||
Object.setPrototypeOf(obj, Base);
|
||||
|
||||
assert.equal(obj.set(), 3);
|
||||
assert.equal(Base.test, undefined);
|
||||
assert.equal(obj.test, 3);
|
||||
@@ -0,0 +1,27 @@
|
||||
"use strict";
|
||||
|
||||
var _obj;
|
||||
|
||||
function set(target, property, value, receiver) { if (typeof Reflect !== "undefined" && Reflect.set) { set = Reflect.set; } else { set = function set(target, property, value, receiver) { var base = _superPropBase(target, property); var desc; if (base) { desc = Object.getOwnPropertyDescriptor(base, property); if (desc.set) { desc.set.call(receiver, value); return true; } else if (!desc.writable) { return false; } } desc = Object.getOwnPropertyDescriptor(receiver, property); if (desc) { if (!desc.writable) { return false; } desc.value = value; Object.defineProperty(receiver, property, desc); } else { _defineProperty(receiver, property, value); } return true; }; } return set(target, property, value, receiver); }
|
||||
|
||||
function _set(target, property, value, receiver, isStrict) { const s = set(target, property, value, receiver || target); if (!s && isStrict) { throw new Error('failed to set property'); } return value; }
|
||||
|
||||
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||||
|
||||
function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; }
|
||||
|
||||
function _getPrototypeOf(o) { _getPrototypeOf = Object.getPrototypeOf || function _getPrototypeOf(o) { return o.__proto__; }; return _getPrototypeOf(o); }
|
||||
|
||||
const Base = {};
|
||||
const obj = _obj = {
|
||||
test: 2,
|
||||
|
||||
set() {
|
||||
return _set(_getPrototypeOf(_obj), "test", 3, this, true);
|
||||
}
|
||||
|
||||
};
|
||||
Object.setPrototypeOf(obj, Base);
|
||||
assert.equal(obj.set(), 3);
|
||||
assert.equal(Base.test, undefined);
|
||||
assert.equal(obj.test, 3);
|
||||
@@ -0,0 +1,19 @@
|
||||
var Base = {
|
||||
};
|
||||
|
||||
var called = false;
|
||||
var obj = {
|
||||
get test() {
|
||||
called = true;
|
||||
},
|
||||
|
||||
set() {
|
||||
return super.test = 3;
|
||||
},
|
||||
};
|
||||
Object.setPrototypeOf(obj, Base);
|
||||
|
||||
assert.equal(obj.set(), 3);
|
||||
assert.equal(called, false);
|
||||
assert.equal(Base.test, undefined);
|
||||
assert.equal(obj.test, undefined);
|
||||
@@ -0,0 +1,22 @@
|
||||
"use strict";
|
||||
const Base = {
|
||||
};
|
||||
|
||||
let called = false;
|
||||
const obj = {
|
||||
get test() {
|
||||
called = true;
|
||||
},
|
||||
|
||||
set() {
|
||||
return super.test = 3;
|
||||
},
|
||||
};
|
||||
Object.setPrototypeOf(obj, Base);
|
||||
|
||||
assert.throws(() => {
|
||||
obj.set();
|
||||
});
|
||||
assert.equal(called, false);
|
||||
assert.equal(Base.test, undefined);
|
||||
assert.equal(obj.test, undefined);
|
||||
@@ -0,0 +1,20 @@
|
||||
"use strict";
|
||||
const Base = {
|
||||
};
|
||||
|
||||
const obj = {
|
||||
get test() { },
|
||||
|
||||
set() {
|
||||
return super.test = 3;
|
||||
},
|
||||
};
|
||||
Object.setPrototypeOf(obj, Base);
|
||||
|
||||
assert.throws(() => {
|
||||
// this requires helpers to be in file (not external), so they
|
||||
// are in "strict" mode code.
|
||||
obj.set();
|
||||
});
|
||||
assert.equal(Base.test, undefined);
|
||||
assert.equal(obj.test, undefined);
|
||||
@@ -0,0 +1,31 @@
|
||||
"use strict";
|
||||
|
||||
var _obj;
|
||||
|
||||
function set(target, property, value, receiver) { if (typeof Reflect !== "undefined" && Reflect.set) { set = Reflect.set; } else { set = function set(target, property, value, receiver) { var base = _superPropBase(target, property); var desc; if (base) { desc = Object.getOwnPropertyDescriptor(base, property); if (desc.set) { desc.set.call(receiver, value); return true; } else if (!desc.writable) { return false; } } desc = Object.getOwnPropertyDescriptor(receiver, property); if (desc) { if (!desc.writable) { return false; } desc.value = value; Object.defineProperty(receiver, property, desc); } else { _defineProperty(receiver, property, value); } return true; }; } return set(target, property, value, receiver); }
|
||||
|
||||
function _set(target, property, value, receiver, isStrict) { const s = set(target, property, value, receiver || target); if (!s && isStrict) { throw new Error('failed to set property'); } return value; }
|
||||
|
||||
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||||
|
||||
function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; }
|
||||
|
||||
function _getPrototypeOf(o) { _getPrototypeOf = Object.getPrototypeOf || function _getPrototypeOf(o) { return o.__proto__; }; return _getPrototypeOf(o); }
|
||||
|
||||
const Base = {};
|
||||
const obj = _obj = {
|
||||
get test() {},
|
||||
|
||||
set() {
|
||||
return _set(_getPrototypeOf(_obj), "test", 3, this, true);
|
||||
}
|
||||
|
||||
};
|
||||
Object.setPrototypeOf(obj, Base);
|
||||
assert.throws(() => {
|
||||
// this requires helpers to be in file (not external), so they
|
||||
// are in "strict" mode code.
|
||||
obj.set();
|
||||
});
|
||||
assert.equal(Base.test, undefined);
|
||||
assert.equal(obj.test, undefined);
|
||||
@@ -0,0 +1,14 @@
|
||||
"use strict";
|
||||
const Base = {
|
||||
};
|
||||
|
||||
const obj = {
|
||||
set() {
|
||||
return super.test = 3;
|
||||
},
|
||||
};
|
||||
Object.setPrototypeOf(obj, Base);
|
||||
|
||||
assert.equal(obj.set(), 3);
|
||||
assert.equal(Base.test, undefined);
|
||||
assert.equal(obj.test, 3);
|
||||
@@ -0,0 +1,14 @@
|
||||
"use strict";
|
||||
const Base = {
|
||||
};
|
||||
|
||||
const obj = {
|
||||
set() {
|
||||
return super.test = 3;
|
||||
},
|
||||
};
|
||||
Object.setPrototypeOf(obj, Base);
|
||||
|
||||
assert.equal(obj.set(), 3);
|
||||
assert.equal(Base.test, undefined);
|
||||
assert.equal(obj.test, 3);
|
||||
@@ -0,0 +1,25 @@
|
||||
"use strict";
|
||||
|
||||
var _obj;
|
||||
|
||||
function set(target, property, value, receiver) { if (typeof Reflect !== "undefined" && Reflect.set) { set = Reflect.set; } else { set = function set(target, property, value, receiver) { var base = _superPropBase(target, property); var desc; if (base) { desc = Object.getOwnPropertyDescriptor(base, property); if (desc.set) { desc.set.call(receiver, value); return true; } else if (!desc.writable) { return false; } } desc = Object.getOwnPropertyDescriptor(receiver, property); if (desc) { if (!desc.writable) { return false; } desc.value = value; Object.defineProperty(receiver, property, desc); } else { _defineProperty(receiver, property, value); } return true; }; } return set(target, property, value, receiver); }
|
||||
|
||||
function _set(target, property, value, receiver, isStrict) { const s = set(target, property, value, receiver || target); if (!s && isStrict) { throw new Error('failed to set property'); } return value; }
|
||||
|
||||
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||||
|
||||
function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; }
|
||||
|
||||
function _getPrototypeOf(o) { _getPrototypeOf = Object.getPrototypeOf || function _getPrototypeOf(o) { return o.__proto__; }; return _getPrototypeOf(o); }
|
||||
|
||||
const Base = {};
|
||||
const obj = _obj = {
|
||||
set() {
|
||||
return _set(_getPrototypeOf(_obj), "test", 3, this, true);
|
||||
}
|
||||
|
||||
};
|
||||
Object.setPrototypeOf(obj, Base);
|
||||
assert.equal(obj.set(), 3);
|
||||
assert.equal(Base.test, undefined);
|
||||
assert.equal(obj.test, 3);
|
||||
@@ -0,0 +1,19 @@
|
||||
var Base = {
|
||||
};
|
||||
|
||||
var value = 2;
|
||||
var obj = {
|
||||
set test(v) {
|
||||
value = v;
|
||||
},
|
||||
|
||||
set() {
|
||||
return super.test = 3;
|
||||
},
|
||||
};
|
||||
Object.setPrototypeOf(obj, Base);
|
||||
|
||||
assert.equal(obj.set(), 3);
|
||||
assert.equal(Base.test, undefined);
|
||||
assert.equal(value, 2);
|
||||
assert.equal(obj.test, undefined);
|
||||
@@ -0,0 +1,22 @@
|
||||
"use strict";
|
||||
const Base = {
|
||||
};
|
||||
|
||||
let value = 2;
|
||||
const obj = {
|
||||
set test(v) {
|
||||
value = v;
|
||||
},
|
||||
|
||||
set() {
|
||||
return super.test = 3;
|
||||
},
|
||||
};
|
||||
Object.setPrototypeOf(obj, Base);
|
||||
|
||||
assert.throws(() => {
|
||||
obj.set();
|
||||
});
|
||||
assert.equal(value, 2);
|
||||
assert.equal(Base.test, undefined);
|
||||
assert.equal(obj.test, undefined);
|
||||
@@ -0,0 +1,21 @@
|
||||
"use strict";
|
||||
const Base = {
|
||||
};
|
||||
|
||||
let value = 2;
|
||||
const obj = {
|
||||
set test(v) {
|
||||
assert.equal(this, obj);
|
||||
value = v;
|
||||
},
|
||||
|
||||
set() {
|
||||
return super.test = 3;
|
||||
},
|
||||
};
|
||||
Object.setPrototypeOf(obj, Base);
|
||||
|
||||
assert.equal(obj.set(), 3);
|
||||
assert.equal(Base.test, undefined);
|
||||
assert.equal(value, 3);
|
||||
assert.equal(obj.test, undefined);
|
||||
@@ -0,0 +1,32 @@
|
||||
"use strict";
|
||||
|
||||
var _obj;
|
||||
|
||||
function set(target, property, value, receiver) { if (typeof Reflect !== "undefined" && Reflect.set) { set = Reflect.set; } else { set = function set(target, property, value, receiver) { var base = _superPropBase(target, property); var desc; if (base) { desc = Object.getOwnPropertyDescriptor(base, property); if (desc.set) { desc.set.call(receiver, value); return true; } else if (!desc.writable) { return false; } } desc = Object.getOwnPropertyDescriptor(receiver, property); if (desc) { if (!desc.writable) { return false; } desc.value = value; Object.defineProperty(receiver, property, desc); } else { _defineProperty(receiver, property, value); } return true; }; } return set(target, property, value, receiver); }
|
||||
|
||||
function _set(target, property, value, receiver, isStrict) { const s = set(target, property, value, receiver || target); if (!s && isStrict) { throw new Error('failed to set property'); } return value; }
|
||||
|
||||
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||||
|
||||
function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; }
|
||||
|
||||
function _getPrototypeOf(o) { _getPrototypeOf = Object.getPrototypeOf || function _getPrototypeOf(o) { return o.__proto__; }; return _getPrototypeOf(o); }
|
||||
|
||||
const Base = {};
|
||||
let value = 2;
|
||||
const obj = _obj = {
|
||||
set test(v) {
|
||||
assert.equal(this, obj);
|
||||
value = v;
|
||||
},
|
||||
|
||||
set() {
|
||||
return _set(_getPrototypeOf(_obj), "test", 3, this, true);
|
||||
}
|
||||
|
||||
};
|
||||
Object.setPrototypeOf(obj, Base);
|
||||
assert.equal(obj.set(), 3);
|
||||
assert.equal(Base.test, undefined);
|
||||
assert.equal(value, 3);
|
||||
assert.equal(obj.test, undefined);
|
||||
@@ -0,0 +1,21 @@
|
||||
"use strict";
|
||||
let value = 1;
|
||||
const Base = {
|
||||
set test(v) {
|
||||
value = v;
|
||||
}
|
||||
};
|
||||
|
||||
const obj = {
|
||||
test: 2,
|
||||
|
||||
set() {
|
||||
return super.test = 3;
|
||||
},
|
||||
};
|
||||
Object.setPrototypeOf(obj, Base);
|
||||
|
||||
assert.equal(obj.set(), 3);
|
||||
assert.equal(value, 3);
|
||||
assert.equal(Base.test, undefined);
|
||||
assert.equal(obj.test, 2);
|
||||
@@ -0,0 +1,21 @@
|
||||
"use strict";
|
||||
let value = 1;
|
||||
const Base = {
|
||||
set test(v) {
|
||||
value = v;
|
||||
}
|
||||
};
|
||||
|
||||
const obj = {
|
||||
test: 2,
|
||||
|
||||
set() {
|
||||
return super.test = 3;
|
||||
},
|
||||
};
|
||||
Object.setPrototypeOf(obj, Base);
|
||||
|
||||
assert.equal(obj.set(), 3);
|
||||
assert.equal(value, 3);
|
||||
assert.equal(Base.test, undefined);
|
||||
assert.equal(obj.test, 2);
|
||||
@@ -0,0 +1,34 @@
|
||||
"use strict";
|
||||
|
||||
var _obj;
|
||||
|
||||
function set(target, property, value, receiver) { if (typeof Reflect !== "undefined" && Reflect.set) { set = Reflect.set; } else { set = function set(target, property, value, receiver) { var base = _superPropBase(target, property); var desc; if (base) { desc = Object.getOwnPropertyDescriptor(base, property); if (desc.set) { desc.set.call(receiver, value); return true; } else if (!desc.writable) { return false; } } desc = Object.getOwnPropertyDescriptor(receiver, property); if (desc) { if (!desc.writable) { return false; } desc.value = value; Object.defineProperty(receiver, property, desc); } else { _defineProperty(receiver, property, value); } return true; }; } return set(target, property, value, receiver); }
|
||||
|
||||
function _set(target, property, value, receiver, isStrict) { const s = set(target, property, value, receiver || target); if (!s && isStrict) { throw new Error('failed to set property'); } return value; }
|
||||
|
||||
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||||
|
||||
function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; }
|
||||
|
||||
function _getPrototypeOf(o) { _getPrototypeOf = Object.getPrototypeOf || function _getPrototypeOf(o) { return o.__proto__; }; return _getPrototypeOf(o); }
|
||||
|
||||
let value = 1;
|
||||
const Base = {
|
||||
set test(v) {
|
||||
value = v;
|
||||
}
|
||||
|
||||
};
|
||||
const obj = _obj = {
|
||||
test: 2,
|
||||
|
||||
set() {
|
||||
return _set(_getPrototypeOf(_obj), "test", 3, this, true);
|
||||
}
|
||||
|
||||
};
|
||||
Object.setPrototypeOf(obj, Base);
|
||||
assert.equal(obj.set(), 3);
|
||||
assert.equal(value, 3);
|
||||
assert.equal(Base.test, undefined);
|
||||
assert.equal(obj.test, 2);
|
||||
@@ -1,8 +1,14 @@
|
||||
var _obj;
|
||||
|
||||
function _set(object, property, value, receiver) { var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = _getPrototypeOf(object); if (parent !== null) { _set(parent, property, value, receiver); } } else if ("value" in desc && desc.writable) { desc.value = value; } else { var setter = desc.set; if (setter !== undefined) { setter.call(receiver, value); } } return value; }
|
||||
function set(target, property, value, receiver) { if (typeof Reflect !== "undefined" && Reflect.set) { set = Reflect.set; } else { set = function set(target, property, value, receiver) { var base = _superPropBase(target, property); var desc; if (base) { desc = Object.getOwnPropertyDescriptor(base, property); if (desc.set) { desc.set.call(receiver, value); return true; } else if (!desc.writable) { return false; } } desc = Object.getOwnPropertyDescriptor(receiver, property); if (desc) { if (!desc.writable) { return false; } desc.value = value; Object.defineProperty(receiver, property, desc); } else { _defineProperty(receiver, property, value); } return true; }; } return set(target, property, value, receiver); }
|
||||
|
||||
function _get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = _getPrototypeOf(object); if (parent === null) { return undefined; } else { return _get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }
|
||||
function _set(target, property, value, receiver, isStrict) { const s = set(target, property, value, receiver || target); if (!s && isStrict) { throw new Error('failed to set property'); } return value; }
|
||||
|
||||
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||||
|
||||
function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); }
|
||||
|
||||
function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; }
|
||||
|
||||
function _getPrototypeOf(o) { _getPrototypeOf = Object.getPrototypeOf || function _getPrototypeOf(o) { return o.__proto__; }; return _getPrototypeOf(o); }
|
||||
|
||||
@@ -10,6 +16,6 @@ foo = _obj = {
|
||||
bar: function () {
|
||||
var _ref;
|
||||
|
||||
return _ref = _get(_getPrototypeOf(_obj), "baz", this), _set(_getPrototypeOf(_obj), "baz", _ref ** 12, this);
|
||||
return _ref = _get(_getPrototypeOf(_obj), "baz", this), _set(_getPrototypeOf(_obj), "baz", _ref ** 12, this, false);
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user