如何为JSON对象设置原型?

时间:2010-11-04 13:13:22

标签: javascript oop json casting

我从服务器接收到一些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();

我该怎么做?

2 个答案:

答案 0 :(得分:3)

好吧,我可以建议试试这些:

  • 通过向所有Javascript对象添加所需的功能(不良做法)

    Object.prototype.lol = function() { alert(this.a); };
    var x = {a : 'b'};
    x.lol();
    
  • 通过函数“扩展”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');
    

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

答案 1 :(得分:1)

行。这是答案(IE不兼容):

json.__proto__ = MyClass.prototype;

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

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