Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何为JSON对象设置原型?_Javascript_Oop_Json_Casting - Fatal编程技术网

Javascript 如何为JSON对象设置原型?

Javascript 如何为JSON对象设置原型?,javascript,oop,json,casting,Javascript,Oop,Json,Casting,我从服务器接收到一些JSON对象,我想将其“类型转换”或“祝福”到一个具有已定义方法的对象。有没有办法为普通JSON对象设置原型 function MyClass(someValue) { this.myProperty = someValue; } MyClass.prototype.someMethod = function() { return "Here's " + this.myProperty + "!"}; var json = {myProperty : 'someV

我从服务器接收到一些JSON对象,我想将其“类型转换”或“祝福”到一个具有已定义方法的对象。有没有办法为普通JSON对象设置原型

function MyClass(someValue) {
    this.myProperty = someValue;
}

MyClass.prototype.someMethod = function() { return "Here's " + this.myProperty + "!"};

var json = {myProperty : 'someValue'};

// ??? json.prototype = MyClass doesn't work, of course.

var result = json.someMethod();
我该怎么做呢?

好的。以下是答案(即不兼容):

谢天谢地,我的申请中不需要%$@$%#IE


(当我这样做时,还有另一种可能性:在MyClass prototype中创建一个包装函数,将JSON中的所有属性复制到新对象中;浅层复制应该足够了)。

好吧,我可以建议尝试以下方法:

  • 通过向所有Javascript对象添加所需的函数(糟糕的做法)

  • 通过使用函数“扩展”JSON:

    var json = {a : 'b', b : 123};
    function extend(obj) {
        obj.func1 = function(param) {
            alert(this[param]);
        }
    }
    extend(json);
    json.func1('b');
    
    var json = {a : 'b', b : 123};
    function extendToFunc(obj) {
        var theLibrary = function(obj) {
            /**
             * The same as above.
            */
            this.func1 = function(param) {
                 alert(obj[param]);
            }
        };
        return new theLibrary(obj);
    }
    var jsonFunc = extendToFunc(json);
    jsonFunc.func1('b');
    
  • 通过“使”对象成为函数:

    var json = {a : 'b', b : 123};
    function extend(obj) {
        obj.func1 = function(param) {
            alert(this[param]);
        }
    }
    extend(json);
    json.func1('b');
    
    var json = {a : 'b', b : 123};
    function extendToFunc(obj) {
        var theLibrary = function(obj) {
            /**
             * The same as above.
            */
            this.func1 = function(param) {
                 alert(obj[param]);
            }
        };
        return new theLibrary(obj);
    }
    var jsonFunc = extendToFunc(json);
    jsonFunc.func1('b');
    

或者你也可以使用JS框架。或者你能想到的任何其他方法:)我的例子很简单,它们可以扩展到你需要的任何复杂的东西。

我不知道这在Safari或Chrome中是否有效。你所说的“其他可能性”实际上是最好的方法。@Pointy我已经测试过了,它确实存在。对于IE,我发现了一个很酷的hack,可以用来代替proto:。好吧,好吧,它不是标准化的(即使使用ECMAScript 5),所以使用它的风险自负:-)@pointy-lolz。首先是“好的部分”,现在是“坏的部分”。我知道第一个问题是谁写的,看起来好像有人在写第二个。找到一个完美的问题来匹配我目前的问题,但却有一个不适合我需要的答案,真令人失望。复制属性看起来并不像一颗神奇的子弹那么迷人!一个接一个地手动添加这些函数违反了程序员最重要的优点:懒惰。你不必手动添加它们。您可以为此构建一个小框架。它将添加您希望的所有必要方法——您只需通过该框架传递所有JSON即可。我看不出将函数添加到一个“扩展”方法/函数与应用.prototype有多大区别。我认为我的方法更适合于分析应用程序的流程、调试。