将对象传递为参数并使用Object.create使用它来创建单独的对象时,将获得一个空对象。但是,如果您随后使用此新对象引用在初始对象中设置的特定参数,则将获得初始对象的参数值。
我希望这些值包含在新对象中,或者至少不能在其中包含。
var o = { baz: [] };
o.rrr = { a: 1 };
console.log( o, '"o" before timeout called' );
setTimeout(function() { n(o) }, 1000); // setting delay
function n(x) {
console.log( 'x - what we passed', x );
var obj = Object.create( x );
console.log( obj, '"obj" before enhancements is empty' );
console.log( obj.rrr, 'but "obj.rrr" do exist' );
obj.baz = [];
obj.baz.push( 'new value' );
console.log( obj, '"obj" after enhancements contain "baz" only' );
console.log( obj.rrr, 'but "obj.rrr" still exist' );
console.log( o, '"o" after timeout ended' );
console.log( '---- THE END ----' );
}
console.log( o, '"o" after timeout called' );
为何如此?
您可以在保留结构的同时摆脱那些引用吗?
您是否可以一开始就获得新对象中设置的那些值(例如克隆它)?
该Object.create()
方法使用x
新创建的对象的原型创建一个新对象。因此,该属性rrr
直接在中不存在obj
。它存在于[[Prototype]]
(或__proto__
)中
var x = { prop: 1 }
var y = Object.create(x)
console.log(y.prop) // 1
console.log("prop" in y) // true
console.log(y.__proto__ === x) // true
console.log(y.hasOwnProperty("prop")) // false
所述in
如果指定的属性是在指定的对象或操作员返回true其原型链。因此,在这种情况下,它返回true。
但是,hasOwnProperty()
另一方面,该方法返回一个布尔值,该布尔值指示对象是否具有作为其自己的property的属性。这就是y.hasOwnProperty("prop")
即使y.prop
返回1也返回false的原因。
如果要直接在中获取属性y
,则可以使用Object.assign()
。这会将所有可枚举的自身属性从复制x
到空目标对象。
var x = { prop: 1 }
var y = Object.assign({}, x)
console.log(y.prop) // 1
console.log(y.hasOwnProperty("prop")) // true
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句