我总是假设函数的原型在所有对象之间共享,在某种意义上通过引用.因此,如果更改原型属性的值,则共享该原型的所有对象的值也会更改.因此,例如下面似乎不是在所有对象之间共享属性栏,而是复制它.这是正确的吗?构造函数原型的属性是在创建时简单地复制到所有类对象,还是由链接共享?
function foo() { this.bar = 1; } function derived() { } derived.prototype = new foo() object1 = new derived() object2 = new derived() object1.bar = 2; //but notice if I had said here derived.prototype.bar = 3,object1.bar would still equal 2 but object2.bar would equal 3 alert(object2.bar) // this prints 1;
解决方法
当您指定object1.bar = 2时,您正在object1上创建一个自己的属性,此属性仅存在于该对象实例中,并且与其原型无关.
object1上的此属性将遮蔽derived.prototype上存在的值,这意味着当您查找object1.bar时,它将找到直接存在于该对象上的值.
另一方面,如果你查找object2.bar,这个对象没有自己的bar属性,所以属性查找将搜索这个继承自(derived.prototype)的对象,它将找到值1.
您的对象结构如下所示:
object1 -------- | bar: 2 | ----------------- -------- | derived.prototype | ---------- |------> | bar: 1 | -- foo.prototype object2 (no own properties)| ---------- | ------------------ -------- | -> | constructor: foo | | | ----------------- ------------------ -------- | v ------------------ | Object.prototype | ------------------ | v null
原文地址:https://www.jb51.cc/js/154858.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。