我最近开始编写更多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'
我是否错过了某个地方的观点,这是错误的做法还是我做错了?
答案 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);