Javascript:{}的行为

时间:2009-10-23 10:59:05

标签: javascript

  

我对此没有任何了解   初始化的区别   变量{}和命名函数   使用new关键字。我是说哪个   我应该用什么来练习   对象的定义。哪个更多   是适当的,在哪种情况下?

     

然后我做了一个小例子来测试   两种做法。和   我发现了一个非常简单的区别。   每当你初学一个   变量{},变量是   这个对象的唯一引用   {}中给出的定义。 {}本身   没有名字所以它不可能   被称为新的初始化。只有一个   可以参考它。

     

所以我们似乎可以轻松实现   使用{}的对象上的单例模式。   我看到你所拥有的不仅仅是   {}的一个实例甚至不能   如果你这样做,你会得到克隆   只是该对象的参考。

     

我是否采取了正确的行为   {}?

var A = {
 B : 0
};

// A is an object?
document.write("A is an " + typeof A);

让我们尝试克隆对象A

var objectOfA = new Object(A);
objectOfA.B = 1;

//Such operation is not allowed!
//var objectOfA = new A();

var referenceOfA = A;
referenceOfA.B = -1;

document.write("A.B: " + A.B);
document.write("<br/>");

以上referenceOfA.B包含对象A的引用,因此更改referenceOfA.B的值肯定会反映在A.B中。

document.write("referenceOfA.B: " + referenceOfA.B);
document.write("<br/>");

如果成功克隆,则objectOfA应保留值1

document.write("objectOfA.B: " + objectOfA.B);
document.write("<br/>");

以下是结果:

A是一个对象

A.B:-1

referenceOfA.B:-1

objectOfA.B:-1

3 个答案:

答案 0 :(得分:1)

This可能有用,摘录:

CatNames.instance = null; // Will contain the one and only instance of the class

// This function ensures that I always use the same instance of the object
CatNames.getInstance = function() {
        if (CatNames.instance == null) {
                CatNames.instance = new CatNames();
        }
        return CatNames.instance;
}

注意:你不应该克隆单身人士。

答案 1 :(得分:1)

A已经是一个对象,因此new Object(A)只返回A.您可以通过运行

来证明这一点
var c = {};
alert(c === new Object(c));

所以没有克隆正在进行。

您实际上在尝试做什么,以及Singleton模式与此克隆业务有什么关系?

答案 2 :(得分:1)

对于克隆对象,您将需要做更多的工作。像下面的东西。

var a = {
    val:1, 
    clone : function(){
       return {val: a.val, clone : a.clone}
    }
};
var b = a.clone();
b.val = 2;
console.log(a);
console.log(b);

现在您可以克隆一个对象并更改它的值。如果要克隆更复杂的对象,可以为此编写递归函数。

您可以将这些对象文字用作静态类或具有键/值对的对象。

如果要使用非静态类(排序),请使用以下命令:

var MyClass = new function(){}
MyClass.prototype = { 
    val : 1
};
var a = new MyClass();

希望这有帮助。