blob: 9287265631eb83fee78298285f6a4281431ae82e [file] [log] [blame]
// Copyright (C) 2017 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: prod-PropertyDefinition
description: >
computed __proto__ property key is assigned to an own property
info: |
12.2.6 Object Initializer
PropertyDefinition[Yield, Await] :
PropertyName[?Yield, ?Await] : AssignmentExpression[+In, ?Yield, ?Await]
PropertyName[Yield, Await] :
LiteralPropertyName
ComputedPropertyName[?Yield, ?Await]
ComputedPropertyName[Yield, Await] :
[ AssignmentExpression[+In, ?Yield, ?Await] ]
B.3.1__proto__ Property Names in Object Initializers
...
5. If propKey is the String value "__proto__" and if IsComputedPropertyKey(propKey)
is false, then
a. If Type(propValue) is either Object or Null, then
i. Return object.[[SetPrototypeOf]](propValue).
b. Return NormalCompletion(empty).
features: [Symbol]
---*/
var obj;
var sample = {};
obj = {
['__proto__']: sample
};
assert.sameValue(
Object.getPrototypeOf(obj),
Object.prototype,
'does not change the object prototype (ordinary object)'
);
assert(
obj.hasOwnProperty('__proto__'),
'computed __proto__ property is set as an own property (ordinary object)'
);
assert.sameValue(
obj.__proto__,
sample,
'value is properly defined (ordinary object)'
);
obj = {
['__proto__']: null
};
assert.sameValue(
Object.getPrototypeOf(obj),
Object.prototype,
'does not change the object prototype (null)'
);
assert(
obj.hasOwnProperty('__proto__'),
'computed __proto__ property is set as an own property (null)'
);
assert.sameValue(
obj.__proto__,
null,
'value is properly defined (null)'
);
obj = {
['__proto__']: undefined
};
assert.sameValue(
Object.getPrototypeOf(obj),
Object.prototype,
'does not change the object prototype (undefined)'
);
assert(
obj.hasOwnProperty('__proto__'),
'computed __proto__ property is set as an own property (undefined)'
);
assert.sameValue(
obj.__proto__,
undefined,
'value is properly defined (undefined)'
);
var func = function() {};
obj = {
['__proto__']: func
};
assert.sameValue(
Object.getPrototypeOf(obj),
Object.prototype,
'does not change the object prototype (func)'
);
assert(
obj.hasOwnProperty('__proto__'),
'computed __proto__ property is set as an own property (func)'
);
assert.sameValue(
obj.__proto__,
func,
'value is properly defined (func)'
);
var symbol = Symbol('Leo');
obj = {
['__proto__']: symbol
};
assert.sameValue(
Object.getPrototypeOf(obj),
Object.prototype,
'does not change the object prototype (symbol)'
);
assert(
obj.hasOwnProperty('__proto__'),
'computed __proto__ property is set as an own property (symbol)'
);
assert.sameValue(
obj.__proto__,
symbol,
'value is properly defined (symbol)'
);
obj = {
['__proto__']: 42
};
assert.sameValue(
Object.getPrototypeOf(obj),
Object.prototype,
'does not change the object prototype (number)'
);
assert(
obj.hasOwnProperty('__proto__'),
'computed __proto__ property is set as an own property (number)'
);
assert.sameValue(
obj.__proto__,
42,
'value is properly defined (number)'
);
obj = {
['__proto__']: ''
};
assert.sameValue(
Object.getPrototypeOf(obj),
Object.prototype,
'does not change the object prototype (string)'
);
assert(
obj.hasOwnProperty('__proto__'),
'computed __proto__ property is set as an own property (string)'
);
assert.sameValue(
obj.__proto__,
'',
'value is properly defined (string)'
);
obj = {
['__proto__']: false
};
assert.sameValue(
Object.getPrototypeOf(obj),
Object.prototype,
'does not change the object prototype (boolean)'
);
assert(
obj.hasOwnProperty('__proto__'),
'computed __proto__ property is set as an own property (boolean)'
);
assert.sameValue(
obj.__proto__,
false,
'value is properly defined (boolean)'
);