]> source.dussan.org Git - svg.js.git/commitdiff
Allow access to original Array.prototype methods on List prefixed with $
authorMorgan Harris <gormster@me.com>
Wed, 24 Nov 2021 00:35:39 +0000 (11:35 +1100)
committerMorgan Harris <gormster@me.com>
Wed, 24 Nov 2021 00:35:39 +0000 (11:35 +1100)
spec/spec/types/List.js
src/types/List.js

index eb0b40b233e69c6fa9212826785c45883ad842ff..9fd27db38a361f2d15487d6bc66d3fcba1ef00f7 100644 (file)
@@ -71,6 +71,20 @@ describe('List.js', () => {
       delete List.prototype.fooBar
     })
 
+    it('keeps Array prototype names prefixed with $', () => {
+      // We're picking a function that we know isn't part of core svg.js
+      // If we implement an 'unshift' function at some point, change this to something else
+      if (List.prototype.hasOwnProperty('unshift')) {
+        fail('List.unshift is already a function - change this test to use a different name!');
+        return;
+      }
+
+      List.extend([ 'unshift' ])
+      expect(new List().unshift).toEqual(any(Function))
+      expect(new List().$unshift).toEqual(Array.prototype.unshift)
+      delete List.prototype.unshift;
+    });
+
     it('skips reserved names', () => {
       const { constructor, each, toArray } = List.prototype
       List.extend([ 'constructor', 'each', 'toArray' ])
index 197a155610224ee9a4c5ddc454ee088bf70db6a4..97536ed1e0c913a89364784d2d303c1ebe973107 100644 (file)
@@ -47,6 +47,11 @@ List.extend = function (methods) {
     // Don't add private methods
     if (name[0] === '_') return obj
 
+    // Allow access to original Array methods through a prefix
+    if (name in Array.prototype) {
+      obj['$' + name] = Array.prototype[name]
+    }
+
     // Relay every call to each()
     obj[name] = function (...attrs) {
       return this.each(name, ...attrs)