From ee1cce94ef1bec8d03441ad15c5a88e61f524a9c Mon Sep 17 00:00:00 2001 From: Robert Krimen Date: Thu, 13 Feb 2014 21:38:20 -0800 Subject: [PATCH] If set === undefined => writable = false --- object_class.go | 6 +++++- object_test.go | 16 ++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/object_class.go b/object_class.go index deb6261..2a1947f 100644 --- a/object_class.go +++ b/object_class.go @@ -306,7 +306,11 @@ func objectDefineOwnProperty(self *_object, name string, descriptor _property, t property.writeClear() property.value = descriptor.value } else { - property.writeOn() + if descriptor.writable() { + property.writeOn() + } else { + property.writeOff() + } property.value = descriptor.value } } else if isDataDescriptor && descriptor.isDataDescriptor() { diff --git a/object_test.go b/object_test.go index 92b0301..42d1295 100644 --- a/object_test.go +++ b/object_test.go @@ -445,6 +445,22 @@ func TestObjectGetterSetter(t *testing.T) { var def = Object.getOwnPropertyDescriptor(abc, "def"); [ abc.def, typeof def.get, typeof def.set, typeof def.value, def.configurable, def.enumerable, typeof def.writable ]; `, "5,function,undefined,undefined,true,false,undefined") + + test(` + var abc = {}; + Object.defineProperty(abc, "def", { + get: function() { + return 5; + } + configurable: true + }); + Object.preventExtensions(abc); + Object.defineProperty(abc, "def", { + value: "xyzzy", + }); + var def = Object.getOwnPropertyDescriptor(abc, "def"); + [ abc.def, typeof def.get, typeof def.set, def.value, def.configurable, def.enumerable, def.writable ]; + `, "xyzzy,undefined,undefined,xyzzy,true,false,false") } func TestProperty(t *testing.T) {