PHP rocks! wünscht allen Mitgliedern einen guten Rutsch ins neue Jahr 2017 !!!
Hinweis: Das Forum zieht um! Um keine Datenverluste zu haben, schalten wir zwecks Übernahme der Daten das Forum am Sonntag, den 24.04.2016 um ca. 21:00 Uhr offline und passen anschliessend die DNS-Einträge an.
www.php-rocks.de wird euch dann nach den Aktualisierungen der DNS-Server wieder wie gewohnt uneingeschränkt zur Verfügung stehen.
Danke für euer Verständnis!

Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
IE: Nullverweis, nicht null und kein Object (Proxy)
#1
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)
    });
}
Antworten
#2
... 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.
Antworten
#3
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...
Antworten
#4
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
Antworten


Gehe zu: