制作一个json javascript类的新实例?

时间:2011-11-30 13:04:09

标签: javascript json

我最近开始编写更多javascript,并且正在努力以最好的方式完成所有操作。使用JSON格式化我的类似乎是最干净的方式,但我遇到的问题似乎应该是非常基本的,但我很难在任何地方找到答案......可能仅仅是因为缺乏正确的行话!

到目前为止,我一直在用这种方法做事:

function foo(){
   this.bar = 'hello world';
   this.init = function(){
      alert('this.bar');
   }
}

crow = new foo();
crow.init();

这一切似乎都像我期望的那样有效。当我在JSON中布置对象时,虽然我无法创建它的新实例,但只有对原始的引用才能破坏我的许多用途。我在这里做错了什么?

foo = {
   bar = 'hello world';

   init:   function(){
      alert(bar);
   }

}

foo.bar(); // This alerts 'hello world'

crow = foo ;
crow.bar = 'metal' ;
crow.init(); // Outputs 'metal'
foo.init(); // Also outputs 'metal'

我是否错过了某个地方的观点,这是错误的做法还是我做错了?

3 个答案:

答案 0 :(得分:3)

如果要将类中的函数定义为对象,则需要更改函数的原型。以下是您的代码中的示例:

var foo = function() {}
foo.prototype = {
    bar: 'hello world',

    init: function() {
        alert(this.bar);
    }
};

var crow = new foo();
crow.bar = 'metal';
crow.init();

虽然在使用javascript时了解其工作原理至关重要,但John Resig有一个非常适合添加oop features in javascript的小脚本。这个添加允许使用构造函数和超级函数进行psedo继承。

答案 1 :(得分:0)

如果您能够在项目中使用jQuery,那么您可以使用extend方法实现对象深度复制:

var original = { a: 123, b: "xxx" },
    copy = $.extend(true, {}, original);

true 的第一个输入参数意味着副本将是深的。

答案 2 :(得分:0)

所有对象都是通过引用复制的,所以通过执行

crow = foo ;

您将获得对同一对象的引用。为了创建新的对象使用功能:

function apply(o, c){
    if(o && c && typeof c == 'object'){
        for(var p in c){
            if (c.hasOwnProperty(p) {
                o[p] = c[p];
            }
        }
    }
    return o;
};

比你可以使用它

var crow = apply({}, foo);