⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scriptableobject.java

📁 java中比较著名的js引擎当属mozilla开源的rhino
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
     * @param name the identifier for the property     * @return the bitset of attributes     * @exception EvaluatorException if the named property is not found     * @see org.mozilla.javascript.ScriptableObject#has     * @see org.mozilla.javascript.ScriptableObject#READONLY     * @see org.mozilla.javascript.ScriptableObject#DONTENUM     * @see org.mozilla.javascript.ScriptableObject#PERMANENT     * @see org.mozilla.javascript.ScriptableObject#EMPTY     */    public int getAttributes(String name)    {        Slot slot = getNamedSlot(name);        if (slot == null) {            throw Context.reportRuntimeError1("msg.prop.not.found", name);        }        return slot.attributes;    }    /**     * Get the attributes of an indexed property.     *     * @param index the numeric index for the property     * @exception EvaluatorException if the named property is not found     *            is not found     * @return the bitset of attributes     * @see org.mozilla.javascript.ScriptableObject#has     * @see org.mozilla.javascript.ScriptableObject#READONLY     * @see org.mozilla.javascript.ScriptableObject#DONTENUM     * @see org.mozilla.javascript.ScriptableObject#PERMANENT     * @see org.mozilla.javascript.ScriptableObject#EMPTY     */    public int getAttributes(int index)    {        Slot slot = getSlot(null, index);        if (slot == null) {            throw Context.reportRuntimeError1("msg.prop.not.found",                                              String.valueOf(index));        }        return slot.attributes;    }    /**     * Set the attributes of a named property.     *     * The property is specified by <code>name</code>     * as defined for <code>has</code>.<p>     *     * The possible attributes are READONLY, DONTENUM,     * and PERMANENT. Combinations of attributes     * are expressed by the bitwise OR of attributes.     * EMPTY is the state of no attributes set. Any unused     * bits are reserved for future use.     *     * @param name the name of the property     * @param attributes the bitset of attributes     * @exception EvaluatorException if the named property is not found     * @see org.mozilla.javascript.Scriptable#has     * @see org.mozilla.javascript.ScriptableObject#READONLY     * @see org.mozilla.javascript.ScriptableObject#DONTENUM     * @see org.mozilla.javascript.ScriptableObject#PERMANENT     * @see org.mozilla.javascript.ScriptableObject#EMPTY     */    public void setAttributes(String name, int attributes)    {        checkValidAttributes(attributes);        Slot slot = getNamedSlot(name);        if (slot == null) {            throw Context.reportRuntimeError1("msg.prop.not.found", name);        }        slot.attributes = (short) attributes;    }    /**     * Set the attributes of an indexed property.     *     * @param index the numeric index for the property     * @param attributes the bitset of attributes     * @exception EvaluatorException if the named property is not found     * @see org.mozilla.javascript.Scriptable#has     * @see org.mozilla.javascript.ScriptableObject#READONLY     * @see org.mozilla.javascript.ScriptableObject#DONTENUM     * @see org.mozilla.javascript.ScriptableObject#PERMANENT     * @see org.mozilla.javascript.ScriptableObject#EMPTY     */    public void setAttributes(int index, int attributes)    {        checkValidAttributes(attributes);        Slot slot = getSlot(null, index);        if (slot == null) {            throw Context.reportRuntimeError1("msg.prop.not.found",                                              String.valueOf(index));        }        slot.attributes = (short) attributes;    }    /**     * Returns the prototype of the object.     */    public Scriptable getPrototype()    {        return prototypeObject;    }    /**     * Sets the prototype of the object.     */    public void setPrototype(Scriptable m)    {        prototypeObject = m;    }    /**     * Returns the parent (enclosing) scope of the object.     */    public Scriptable getParentScope()    {        return parentScopeObject;    }    /**     * Sets the parent (enclosing) scope of the object.     */    public void setParentScope(Scriptable m)    {        parentScopeObject = m;    }    /**     * Returns an array of ids for the properties of the object.     *     * <p>Any properties with the attribute DONTENUM are not listed. <p>     *     * @return an array of java.lang.Objects with an entry for every     * listed property. Properties accessed via an integer index will     * have a corresponding     * Integer entry in the returned array. Properties accessed by     * a String will have a String entry in the returned array.     */    public Object[] getIds() {        return getIds(false);    }    /**     * Returns an array of ids for the properties of the object.     *     * <p>All properties, even those with attribute DONTENUM, are listed. <p>     *     * @return an array of java.lang.Objects with an entry for every     * listed property. Properties accessed via an integer index will     * have a corresponding     * Integer entry in the returned array. Properties accessed by     * a String will have a String entry in the returned array.     */    public Object[] getAllIds() {        return getIds(true);    }    /**     * Implements the [[DefaultValue]] internal method.     *     * <p>Note that the toPrimitive conversion is a no-op for     * every type other than Object, for which [[DefaultValue]]     * is called. See ECMA 9.1.<p>     *     * A <code>hint</code> of null means "no hint".     *     * @param typeHint the type hint     * @return the default value for the object     *     * See ECMA 8.6.2.6.     */    public Object getDefaultValue(Class typeHint)    {        Context cx = null;        for (int i=0; i < 2; i++) {            boolean tryToString;            if (typeHint == ScriptRuntime.StringClass) {                tryToString = (i == 0);            } else {                tryToString = (i == 1);            }            String methodName;            Object[] args;            if (tryToString) {                methodName = "toString";                args = ScriptRuntime.emptyArgs;            } else {                methodName = "valueOf";                args = new Object[1];                String hint;                if (typeHint == null) {                    hint = "undefined";                } else if (typeHint == ScriptRuntime.StringClass) {                    hint = "string";                } else if (typeHint == ScriptRuntime.ScriptableClass) {                    hint = "object";                } else if (typeHint == ScriptRuntime.FunctionClass) {                    hint = "function";                } else if (typeHint == ScriptRuntime.BooleanClass                           || typeHint == Boolean.TYPE)                {                    hint = "boolean";                } else if (typeHint == ScriptRuntime.NumberClass ||                         typeHint == ScriptRuntime.ByteClass ||                         typeHint == Byte.TYPE ||                         typeHint == ScriptRuntime.ShortClass ||                         typeHint == Short.TYPE ||                         typeHint == ScriptRuntime.IntegerClass ||                         typeHint == Integer.TYPE ||                         typeHint == ScriptRuntime.FloatClass ||                         typeHint == Float.TYPE ||                         typeHint == ScriptRuntime.DoubleClass ||                         typeHint == Double.TYPE)                {                    hint = "number";                } else {                    throw Context.reportRuntimeError1(                        "msg.invalid.type", typeHint.toString());                }                args[0] = hint;            }            Object v = getProperty(this, methodName);            if (!(v instanceof Function))                continue;            Function fun = (Function) v;            if (cx == null)                cx = Context.getContext();            v = fun.call(cx, fun.getParentScope(), this, args);            if (v != null) {                if (!(v instanceof Scriptable)) {                    return v;                }                if (typeHint == ScriptRuntime.ScriptableClass                    || typeHint == ScriptRuntime.FunctionClass)                {                    return v;                }                if (tryToString && v instanceof Wrapper) {                    // Let a wrapped java.lang.String pass for a primitive                    // string.                    Object u = ((Wrapper)v).unwrap();                    if (u instanceof String)                        return u;                }            }        }        // fall through to error        String arg = (typeHint == null) ? "undefined" : typeHint.getName();        throw ScriptRuntime.typeError1("msg.default.value", arg);    }    /**     * Implements the instanceof operator.     *     * <p>This operator has been proposed to ECMA.     *     * @param instance The value that appeared on the LHS of the instanceof     *              operator     * @return true if "this" appears in value's prototype chain     *     */    public boolean hasInstance(Scriptable instance) {        // Default for JS objects (other than Function) is to do prototype        // chasing.  This will be overridden in NativeFunction and non-JS        // objects.        return ScriptRuntime.jsDelegatesTo(instance, this);    }    /**     * Custom <tt>==</tt> operator.     * Must return {@link Scriptable#NOT_FOUND} if this object does not     * have custom equality operator for the given value,     * <tt>Boolean.TRUE</tt> if this object is equivalent to <tt>value</tt>,     * <tt>Boolean.FALSE</tt> if this object is not equivalent to     * <tt>value</tt>.     * <p>     * The default implementation returns Boolean.TRUE     * if <tt>this == value</tt> or {@link Scriptable#NOT_FOUND} otherwise.     * It indicates that by default custom equality is available only if     * <tt>value</tt> is <tt>this</tt> in which case true is returned.     */    protected Object equivalentValues(Object value)    {        return (this == value) ? Boolean.TRUE : Scriptable.NOT_FOUND;    }    /**     * Defines JavaScript objects from a Java class that implements Scriptable.     *     * If the given class has a method     * <pre>     * static void init(Context cx, Scriptable scope, boolean sealed);</pre>     *     * or its compatibility form     * <pre>     * static void init(Scriptable scope);</pre>     *     * then it is invoked and no further initialization is done.<p>     *     * However, if no such a method is found, then the class's constructors and     * methods are used to initialize a class in the following manner.<p>     *     * First, the zero-parameter constructor of the class is called to     * create the prototype. If no such constructor exists,     * a {@link EvaluatorException} is thrown. <p>     *     * Next, all methods are scanned for special prefixes that indicate that they     * have special meaning for defining JavaScript objects.     * These special prefixes are     * <ul>     * <li><code>jsFunction_</code> for a JavaScript function     * <li><code>jsStaticFunction_</code> for a JavaScript function that     *           is a property of the constructor     * <li><code>jsGet_</code> for a getter of a JavaScript property     * <li><code>jsSet_</code> for a setter of a JavaScript property     * <li><code>jsConstructor</code> for a JavaScript function that     *           is the constructor     * </ul><p>     *     * If the method's name begins with "jsFunction_", a JavaScript function     * is created with a name formed from the rest of the Java method name     * following "jsFunction_". So a Java method named "jsFunction_foo" will     * define a JavaScript method "foo". Calling this JavaScript function     * will cause the Java method to be called. The parameters of the method     * must be of number and types as defined by the FunctionObject class.     * The JavaScript function is then added as a property     * of the prototype. <p>     *     * If the method's name begins with "jsStaticFunction_", it is handled     * similarly except that the resulting JavaScript function is added as a     * property of the constructor object. The Java method must be static.     *     * If the method's name begins with "jsGet_" or "jsSet_", the method is     * considered to define a property. Accesses to the defined property     * will result in calls to these getter and setter methods. If no     * setter is defined, the property is defined as READONLY.<p>     *     * If the method's name is "jsConstructor", the method is     * considered to define the body of the constructor. Only one     * method of this name may be defined.     * If no method is found that can serve as constructor, a Java     * constructor will be selected to serve as the JavaScript     * constructor in the following manner. If the class has only one     * Java constructor, that constructor is used to define     * the JavaScript constructor. If the the class has two constructors,     * one must be the zero-argument constructor (otherwise an     * {@link EvaluatorException} would have already been thrown     * when the prototype was to be created). In this case     * the Java constructor with one or more parameters will be used

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -