gpt4 book ai didi

JavaScript:如何按值传递对象?

转载 作者:IT王子 更新时间:2023-10-29 02:45:50 26 4
gpt4 key购买 nike

  • 当将对象作为参数传递时,JavaScript 通过引用传递它们,这使得创建对象的本地副本变得困难。

    var o = {};
    (function(x){
    var obj = x;
    obj.foo = 'foo';
    obj.bar = 'bar';
    })(o)

    o 将有 .foo.bar

  • 可以通过克隆来解决这个问题;简单的例子:

    var o = {};

    function Clone(x) {
    for(p in x)
    this[p] = (typeof(x[p]) == 'object')? new Clone(x[p]) : x[p];
    }

    (function(x){
    var obj = new Clone(x);
    obj.foo = 'foo';
    obj.bar = 'bar';
    })(o)

    o 不会有 .foo.bar


问题

  1. 除了创建本地副本/克隆之外,是否有更好的按值传递对象的方法?

最佳答案

不是真的。

根据您的实际需要,一种可能性可能是将o设置为新对象的原型(prototype)。

var o = {};
(function(x){
var obj = Object.create( x );
obj.foo = 'foo';
obj.bar = 'bar';
})(o);

alert( o.foo ); // undefined

因此,您添加到 obj 的任何属性都不会添加到 o。添加到 obj 且属性名称与 o 中的属性相同的任何属性都将隐藏 o 属性。

当然,任何添加到 o 的属性都可以从 obj 获得,前提是它们没有被隐藏,并且所有具有 o 的对象在原型(prototype)链中将看到对 o 的相同更新。

此外,如果 obj 有一个引用另一个对象的属性,例如数组,您需要确保在向对象添加成员之前隐藏该对象,否则,这些成员将被添加到obj,并将在原型(prototype)链中所有具有obj的对象之间共享。

var o = {
baz: []
};
(function(x){
var obj = Object.create( x );

obj.baz.push( 'new value' );

})(o);

alert( o.baz[0] ); // 'new_value'

在这里您可以看到,因为您没有使用 obj 上的 baz 属性隐藏 o 上的 baz 数组o.baz 数组被修改。

因此,您需要先对其进行阴影处理:

var o = {
baz: []
};
(function(x){
var obj = Object.create( x );

obj.baz = [];
obj.baz.push( 'new value' );

})(o);

alert( o.baz[0] ); // undefined

关于JavaScript:如何按值传递对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7574054/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com