javascript函数及其原型

javascript函数及其原型,javascript,function,properties,this,Javascript,Function,Properties,This,代码如下: 函数A(){ this.name=“kl”; this.obj2={a:1}; } A.prototype.city=“中国”; A.prototype.obj={age:30}; var a=新的a(); var b=新的A(); a、 name=“神户”; a、 对象年龄=20岁; a、 城市=“美国” a、 obj2.a=30; console.log(b.name);//k1 console.log(b.city);//为什么是中国? console.log(b.obj);

代码如下:

函数A(){
this.name=“kl”;
this.obj2={a:1};
}
A.prototype.city=“中国”;
A.prototype.obj={age:30};
var a=新的a();
var b=新的A();
a、 name=“神户”;
a、 对象年龄=20岁;
a、 城市=“美国”
a、 obj2.a=30;
console.log(b.name);//k1
console.log(b.city);//为什么是中国?
console.log(b.obj);//当b.city=china时,为什么b.obj={age:20}

console.log(b.obj2);//{a:1}
两个对象的原型链中都有
city
obj
。但是,如果您执行
a.city=“American”
操作,您将在
a
本身上创建一个新的属性
city
,将属性
city
隐藏在属性链中。
指定给属性将(几乎)始终在对象本身上创建该属性

a.obj.age=20读取(不指定!)a.obj所引用的对象,并更新其
age
属性
a
b
具有相同的原型,因此
a.obj
b.obj
解析为相同的对象。如果对象以任何方式发生变异,它将以相同的方式影响
a
b

Chrome控制台的结构:


两个对象的原型链中都有
城市
obj
。但是,如果您执行
a.city=“American”
操作,您将在
a
本身上创建一个新的属性
city
,将属性
city
隐藏在属性链中。
指定给属性将(几乎)始终在对象本身上创建该属性

a.obj.age=20读取(不指定!)a.obj所引用的对象,并更新其
age
属性
a
b
具有相同的原型,因此
a.obj
b.obj
解析为相同的对象。如果对象以任何方式发生变异,它将以相同的方式影响
a
b

Chrome控制台的结构:


让我们一行一行地看一下:

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

    • 让我们一行一行地看一下:

      • 首先,
        A.prototype
        指向一个对象
      • 当您运行
        var a=new a()时
        
      • 创建一个设置为“this”的新对象
      • 此新对象具有属性
        name
        obj2
        ,这些属性的值为
        kl
        {a:1}
      • 此对象链接到A.prototype指向的对象,因此建立了原型链
      • 函数A
        的末尾,函数实际运行
        并返回该值
        ,它逐字返回创建的要分配给
        a
        的对象
      • var b=newa()执行与上述相同的操作
      • 当您运行
        a.name=“kobe”
        ,您正在将值从
        kl
        修改为
        kobe
      • 当您运行
        a.city=“American”,您正在
        a
        本身上创建一个新属性
        city
      • 当你运行
        a.obj2.a=30,您也只修改了一个值
      • 但是当你运行
        a.obj.age=20,有些不同
        
        • a
          本身没有属性
          obj
          ,因此它沿着原型链向上到达对象
          a.prototype
          指向并找到属性
          obj
          ,因此这行代码实际上是在修改
          obj
          ,并将
          obj.age
          的值从30更改为20
      • 执行
        b.name
        时,由于
        b
        具有值为
        kl
        的属性
        name
        ,因此它会打印
        kl
      • 但是,
        b
        本身没有属性
        city
        ,因此它会上升到p