Javascript Object.create与new继承混淆
首先,我确实在很多地方搜索了这个,但没有找到一个合适的答案,但我也意识到这可能只是我的失败 这与“新建”vs.Object.create()创建的对象有关。 背景:当使用“新建”创建对象时,我得到一个对象,它是原始对象的副本,填充了原始对象的属性,但它是自己的东西。但是,当我使用“object.create()”创建一个对象时,我得到一个新对象,它似乎只是指向指定的原型。在新对象中指定值时,这似乎不是问题,因为新值是在新对象中创建的。但是,当我将键值对放入由new创建的对象中的对象时,它只会影响新对象;但是,如果我对object.create()创建的对象执行相同的操作,它会更改原型,并且共享该原型的所有对象都会受到影响 问题: 这是正确的行为还是我做错了什么?直觉上,我希望无论使用何种方法创建的任何新对象都是单独的“个体”,并且可以单独更改,除非我明确更改原型,但这似乎不是对象的情况。create() 如何使用Object.create()创建原型的唯一实例,并在不影响原型的情况下影响其中的对象?或者我应该接受这不是Object.create()的行为,而是使用构造函数吗? 以下是一些代码作为示例:Javascript Object.create与new继承混淆,javascript,object,inheritance,Javascript,Object,Inheritance,首先,我确实在很多地方搜索了这个,但没有找到一个合适的答案,但我也意识到这可能只是我的失败 这与“新建”vs.Object.create()创建的对象有关。 背景:当使用“新建”创建对象时,我得到一个对象,它是原始对象的副本,填充了原始对象的属性,但它是自己的东西。但是,当我使用“object.create()”创建一个对象时,我得到一个新对象,它似乎只是指向指定的原型。在新对象中指定值时,这似乎不是问题,因为新值是在新对象中创建的。但是,当我将键值对放入由new创建的对象中的对象时,它只会影响
function NewThing(){
this.testVal = 35;
this.testString = "Default";
this.testObj = {};
}
thing={
testVal: 35,
testString: "Default2",
testObj: {}
}
test1 = new NewThing()
//test1 becomes a new Object with all the properties of NewThing
test2 = Object.create(thing)
// test2 becomes an object that seems to point to the thing object
test3 = Object.create(thing)
// test3 becomes an object that also seems to point to the thing object
test1.testVal = 45
//testVal property of test1 seems changed fine
test2.testVal = 45
//testVal property of test2 seems changed and NOT test 3 which is good
test1.testObj["test"]="is fine"
//puts the pair in the object of test1
test2.testObj["test"]="is NOT fine"
//puts the pair in the PROTOTYPE affecting BOTH test2 and test3
NewThing
在每次调用时为testObj
创建新对象
使用Object.create
,由于您没有分配给testObj
,因此您正在更改testObj
引用的共享对象
这就好像您在NewThing
中使用了一个共享对象:
sharedObj = {};
function NewThing(){
this.testVal = 35;
this.testString = "Default";
this.testObj = sharedObj;
}
“当使用“新建”创建对象时,我得到一个对象,它是原始对象的副本,并填充了原始对象的属性”-不,没有。原始对象没有任何属性。构造函数是一个运行以初始化对象的函数,并专门在实例上创建这些属性。使用
Object.create创建对象后,您可以对普通函数执行同样的操作。不确定是重复的还是有用的,但请查看并@Bergi感谢您的更正。你说得对。但是,我仍然需要了解使用不同方法创建的新对象中的对象发生了什么。谢谢你的链接。我很快就会读的。