Skip to content

Commit

Permalink
LibJS: Implement Object.hasOwn() :^)
Browse files Browse the repository at this point in the history
This is currently a TC39 Stage 2 proposal, but let's go for it!

https://github.com/tc39/proposal-accessible-object-hasownproperty

I wrote the C  , @linusg found bugs and wrote the test.
  • Loading branch information
awesomekling committed May 18, 2021
1 parent 94569e5 commit 3ee092c
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 0 deletions.
1 change: 1 addition & 0 deletions Userland/Libraries/LibJS/Runtime/CommonPropertyNames.h
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 135,7 @@ namespace JS {
P(globalThis) \
P(groups) \
P(has) \
P(hasOwn) \
P(hasOwnProperty) \
P(hypot) \
P(ignoreCase) \
Expand Down
12 changes: 12 additions & 0 deletions Userland/Libraries/LibJS/Runtime/ObjectConstructor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 45,7 @@ void ObjectConstructor::initialize(GlobalObject& global_object)
define_native_function(vm.names.values, values, 1, attr);
define_native_function(vm.names.entries, entries, 1, attr);
define_native_function(vm.names.create, create, 2, attr);
define_native_function(vm.names.hasOwn, has_own, 2, attr);
}

ObjectConstructor::~ObjectConstructor()
Expand Down Expand Up @@ -310,4 311,15 @@ JS_DEFINE_NATIVE_FUNCTION(ObjectConstructor::create)
return object;
}

JS_DEFINE_NATIVE_FUNCTION(ObjectConstructor::has_own)
{
auto* object = vm.argument(0).to_object(global_object);
if (vm.exception())
return {};
auto string_or_symbol = StringOrSymbol::from_value(global_object, vm.argument(1));
if (vm.exception())
return {};
return Value(object->has_own_property(string_or_symbol));
}

}
1 change: 1 addition & 0 deletions Userland/Libraries/LibJS/Runtime/ObjectConstructor.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 42,7 @@ class ObjectConstructor final : public NativeFunction {
JS_DECLARE_NATIVE_FUNCTION(values);
JS_DECLARE_NATIVE_FUNCTION(entries);
JS_DECLARE_NATIVE_FUNCTION(create);
JS_DECLARE_NATIVE_FUNCTION(has_own);
};

}
35 changes: 35 additions & 0 deletions Userland/Libraries/LibJS/Tests/builtins/Object/Object.hasOwn.js
Original file line number Diff line number Diff line change
@@ -0,0 1,35 @@
describe("basic functionality", () => {
test("length", () => {
expect(Object.hasOwn).toHaveLength(2);
});

test("returns true for existent own property", () => {
const o = { foo: "bar" };
expect(Object.hasOwn(o, "foo")).toBeTrue();
});

test("returns false for non-existent own property", () => {
const o = {};
expect(Object.hasOwn(o, "foo")).toBeFalse();
});

test("returns false for existent prototype chain property", () => {
const o = {};
Object.prototype.foo = "bar";
expect(Object.hasOwn(o, "foo")).toBeFalse();
});
});

describe("errors", () => {
test("null argument", () => {
expect(() => {
Object.hasOwn(null);
}).toThrowWithMessage(TypeError, "ToObject on null or undefined");
});

test("undefined argument", () => {
expect(() => {
Object.hasOwn(undefined);
}).toThrowWithMessage(TypeError, "ToObject on null or undefined");
});
});

0 comments on commit 3ee092c

Please sign in to comment.