繁体   English   中英

javascript函数和原型

[英]javascript function this and prototype

代码如下:

 function A() { this.name = "kl"; this.obj2 = { a: 1 }; } A.prototype.city = "china"; A.prototype.obj = {age: 30}; var a = new A(); var b = new A(); a.name = "kobe"; a.obj.age = 20; a.city = "American" a.obj2.a = 30; console.log(b.name); // k1 console.log(b.city); // why china ? console.log(b.obj); // when b.city = china, why b.obj = {age: 20} console.log(b.obj2); // {a: 1} 

我的意见是a和b都有它自己的this,因此如何编辑this [property]不能更改b自己的this.value;

财产申报如此分享财产? 是对的 ? 但是当obj更改时,将影响b.obj,而当城市更改时,将不会影响b.city?

这两个对象在其原型链中都有cityobj 但是,如果你做a.city = "American"创建一个新的属性 citya本身,阴影财产city的产业链。
分配给属性将(几乎)始终在对象本身上创建该属性。

a.obj.age = 20; 但是, 读取 (而不是分配!) a.obj引用的对象并更新其age属性。 ab具有相同的原型,因此a.objb.obj解析为相同的对象。 如果对象以任何方式突变,它将以相同的方式影响ab

Chrome控制台的结构:

在此处输入图片说明

让我们逐行浏览以下内容:

  • 首先, A.prototype指向一个对象。
  • 当您运行var a = new A();
    1. 您创建一个设置为“ this”的新对象
    2. 这个新对象的属性nameobj2值分别为kl{ a: 1 }
    3. 该对象链接到A.prototype指向的对象,从而建立了原型链。
    4. function A的末尾,函数实际运行return this; ,字面返回创建要被分配给对象a
  • var b = new A(); 与上述相同
  • 当您运行a.name = "kobe"; ,您正在将值从kl修改为kobe
  • 当您运行a.city = "American"; ,你要创建一个新的属性citya本身
  • 当您运行a.obj2.a = 30; ,您也只在修改一个值。
  • 但是当您运行a.obj.age = 20; ,有些不同
    • a本身没有属性obj ,因此它在原型链上指向对象A.prototype指向,并找到属性obj ,因此这行代码实际上是在修改该obj并更改obj.age的值obj.age从30到20。
  • 当您执行b.name ,由于b具有值为kl属性name ,因此它将输出kl
  • 但是, b本身没有属性city ,因此它沿着原型链向上到达对象A.prototype指向的对象,并查看它是否可以找到对象,就像您之前运行A.prototype.city = "china"; ,所以它打印china
  • console.log(b.obj); 运行时, b转到原型链,并在对象A.prototype指向的对象上找到obj ,因此它打印{age: 20}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM