`DeviceArray.__mul__` etc. don't respect `__jax_array__`
```python
import jax.numpy as jnp

class M:
    def __jax_array__(self):
        return jnp.array([1, 1])

M() * jnp.array([1, 1])
```
produces `TypeError: unsupported operand type(s) for *: 'M' and 'DeviceArray'`

In contrast `jnp.multiply(M(), jnp.array([1, 1]))` handles this just fine. No error, works as expected.

Also, NumPy handles this fine:
```python
import numpy as np

class M:
    def __array__(self):
        return np.array([1, 1])

M() * np.array([1, 1])  # no error!
```
diff --git a/jax/_src/numpy/lax_numpy.py b/jax/_src/numpy/lax_numpy.py
index 9e195f981..c504602af 100644
--- a/jax/_src/numpy/lax_numpy.py
+++ b/jax/_src/numpy/lax_numpy.py
@@ -6774,6 +6774,8 @@ _accepted_binop_types = (int, float, complex, np.generic, np.ndarray, ndarray)
 def _defer_to_unrecognized_arg(binary_op):
   # Ensure that other array types have the chance to override arithmetic.
   def deferring_binary_op(self, other):
+    if hasattr(other, '__jax_array__'):
+      other = other.__jax_array__()
     if not isinstance(other, _accepted_binop_types):
       return NotImplemented
     return binary_op(self, other)
diff --git a/tests/lax_numpy_test.py b/tests/lax_numpy_test.py
index e8225b1f6..1c0941789 100644
--- a/tests/lax_numpy_test.py
+++ b/tests/lax_numpy_test.py
@@ -3852,6 +3852,12 @@ class LaxBackedNumpyTests(jtu.JaxTestCase):
     ans = jnp.array(a)
     self.assertEqual(ans, 3.)
 
+  def testJaxArrayOps(self):
+    class arraylike:
+      def __jax_array__(self):
+        return jnp.array(3.)
+    self.assertArraysEqual(arraylike() * jnp.arange(10), jnp.array(3.) * jnp.arange(10))
+
   def testMemoryView(self):
     self.assertAllClose(
         jnp.array(bytearray(b'\\x2a')),
['jax/_src/numpy/lax_numpy.py', 'tests/lax_numpy_test.py']