Javascript和函数原型赋值

我总是假设函数的原型在所有对象之间共享,在某种意义上通过引用.因此,如果更改原型属性的值,则共享该原型的所有对象的值也会更改.因此,例如下面似乎不是在所有对象之间共享属性栏,而是复制它.这是正确的吗?构造函数原型的属性是在创建时简单地复制到所有类对象,还是由链接共享?
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

哪里—> lines表示表示继承的内部[[Prototype]]链接.

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...