PHP Rocks
IE: Nullverweis, nicht null und kein Object (Proxy) - Druckversion

+- PHP Rocks (https://www.php-rocks.de)
+-- Forum: HTML, CSS, Usability und Barrierefreiheit (https://www.php-rocks.de/https://www.php-rocks.de/forum/11-html-css-usability-und-barrierefreiheit.html)
+--- Forum: JavaScript / JavaScript Frameworks / Ajax (https://www.php-rocks.de/https://www.php-rocks.de/forum/13-javascript-javascript-frameworks-ajax.html)
+--- Thema: IE: Nullverweis, nicht null und kein Object (Proxy) (/https://www.php-rocks.de/thema/113-ie-nullverweis-nicht-null-und-kein-object-proxy-.html)



IE: Nullverweis, nicht null und kein Object (Proxy) - Till - 18.09.2016

Es nervt, es hält mich auf, und es ist peinlich: Immer noch kriege ich den IE nicht in den Griff.

Ich möchte ein Object aus einem anderen "erstellen", zur Minute ist es mir gerade egal ob es kopiert, vererbt oder ein prototype wird, in allen anderen Browsern funktionieren mehrere Möglichkeiten, im IE funktioniert gar nichts Blush

Zitat:SCRIPT5007: Die Eigenschaft "__magic_proxy" eines undefinierten oder Nullverweises kann nicht abgerufen werden.
Cannot create proxy with a non-object as target or handler

Object.create : Argument ist nicht null und kein Object
Function.prototype : geht auch irgendwie nicht, Object nicht erweiterbar
new Object
jQuery.extend
literal
...
geht alles irgendwie nicht?

Der IE 11 hat noch kein Proxy Objekt und benutzt das polyfile!?

Code:
var _ObjectFlow = function()
{

    var _Obj =
    {


        inherit : function($parent,_new)
        {
            var sup = $parent, base = _new;
            var descriptor = Object.getOwnPropertyDescriptor(
                base.prototype,"constructor"
            );
            base.prototype = Object.create(sup);
            var handler =
            Object.create({
                constructor: function(target, args)
                {
                    var obj = Object.create(base.prototype);
                    this.apply(target,obj,args);
                    return obj;
                },
                apply: function(target, that, args)
                {
                    base.apply(that,args);
                }
            });
/*
            if('function'===typeof Promise.polyfill)
            {
                var proxy = Object.create(sup, base);
            }else
            {
                var proxy = new Proxy(base.prototype,handler);
            }
*/
            var proxy = new Proxy(base.prototype,handler);
            
            

            descriptor.value = proxy;
            try
            {
                Object.defineProperty(base, "constructor", descriptor);
            }catch(err)
            {
                console.error(err);
            }

            return proxy;
        },

        extend : function(sup,base)
        {
            var descriptor = Object.getOwnPropertyDescriptor(
                base.prototype,"constructor"
            );
            base.prototype = Object.create(sup.prototype);
            var handler =
            Object.create({
                constructor: function(target, args)
                {
                    var obj = Object.create(base.prototype);
                    this.apply(target,obj,args);
                    return obj;
                },
                apply: function(target, that, args)
                {
                    sup.apply(that,args);
                    base.apply(that,args);
                }
            });
/*
            if('function'===typeof Promise.polyfill)
            {
                var proxy =Object.create(sup.__proto__, base);
            }else
            {
                var proxy = new Proxy(base,handler);
            }
*/
             var proxy = new Proxy(base,handler);


            descriptor /* .value */ = proxy;
            try
            {
                Object.defineProperty(base.prototype, "constructor", descriptor);
            }catch(err)
            {
                console.error(err);
            }

            return proxy;

        }

    };

    return _Obj;
};

var OverloadableObject = /* _ObjectFlow().inherit(_ObjectFlow, _ObjectFlow); */ _ObjectFlow;
OverloadableObject.prototype.__noSuchMethod__ = function(name, args)
{
    if('function' === typeof this.__call)return this.__call(name, args);

    console.warn('Method ' + name + ' of overloaded object and magic method __call is not defined!');

};


/*
var $FRDL = new OverloadableObject();
*/

var $FRDL = _ObjectFlow().inherit(OverloadableObject , function()
    {

    });







/**
*   var t = frdl.overload({}); t.__call=function(name,args){alert(name);alert(JSON.stringify(args));}; t.hallo('welt')
*/

$FRDL.I = {

    constructor : function(){
        
    },

    has: function(target, name)
    {
        return true;
    },
    get: function(target, name, receiver)
    {


        if (name in target.__proto__)
        {
            return target.__proto__[name];
        }


        if (name in receiver.__proto__)
        {
            return receiver.__proto__[name];
        }


        return function()
        {


            try
            {
                var args = Array.prototype.slice.call(arguments);

                if(  'function' === typeof receiver.__call )return receiver.__call(name, args);

            }catch(err)
            {
                console.error(err);
            }


        };
    },


    apply: function(target, THIS, args)
    {
        target.apply(THIS,args);
        this.apply(THIS,args);
    }


};




try{
$FRDL.IO = Object.create( {}, $FRDL.I);    
$FRDL.IO.__magic_proxy = new Proxy(OverloadableObject, $FRDL.I);
}catch(err){
    console.warn(err);
    $FRDL.IO = $.extend($FRDL.I,{
          __magic_proxy : new Proxy(OverloadableObject, $FRDL.I)
    });
}



RE: IE: Nullverweis, nicht null und kein Object (Proxy) - Till - 18.09.2016

... der obige code wirft keinen Fehler wenn ich auf das Proxyobject verzichte
Code:
if('function'===typeof Promise.polyfill)
            {
                var proxy = Object.create(sup, base);
            }else
            {
                var proxy = new Proxy(base.prototype,handler);
            }

     /*       var proxy = new Proxy(base.prototype,handler); */
allerdings funktioniert dann das Überladen der Methode __call nicht.


RE: IE: Nullverweis, nicht null und kein Object (Proxy) - Till - 18.09.2016

Code:
var $FRDL = _ObjectFlow().inherit(OverloadableObject , Object.create(Function));
var $FRDL.I=...
console.dir(typeof $FRDL);
//  FF,Opera=Object      IE=undefined/not editable in strict mode

Da waren noch ein paar Fehler/Ungereimtheiten...

Ich habe jetzt die Objekte $FRDL.I $FERDL.IO getrennt
Code:
var $FRDL = _ObjectFlow().inherit(OverloadableObject , Object.create(Function));
var $I =...

Der IE erzeugt jetzt das Proxy-Objekt, allerdings funktioniert das Überladen leider immer noch nicht:
Zitat:Proxy polyfill does not support trap has

Habe begonnen mir mal ein wenig Typescript anzuschauen, vielleicht hilft es mir ein wenig beim Erstellen der scripts...


RE: IE: Nullverweis, nicht null und kein Object (Proxy) - Till - 02.11.2016

Ich möchte nochmal auf mein Problem zurückkommen, eigentlich ist es für mein framework essentiell.

Um es besser zu beschreiben gebe ich mal ein Beispiel:
Das Object frdl.sql ( = require('webfan/ql') ) soll die jeweilige Methode(n) jeweils nur Bedarf/Aufruf laden:
https://github.com/frdl/-Flow/blob/master/application/webfan/node_modules/webfan/ql.js
var engine = frdl.overload(...

Im IE funktioniert das ganze nicht. Ich muß die Methoden explizit dem Objekt hinzufügen:
Code:
if(!!Proxy.isPolyfile){
    var _k;
    for(_k in ql){
        engine[_k]=ql[_k];
    }
    load(ql);
}

Das bricht mir das Herz Cry