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但是,code>读取(不指定!)a.obj所引用的对象,并更新其age
属性a
和b
具有相同的原型,因此a.obj
和b.obj
解析为相同的对象。如果对象以任何方式发生变异,它将以相同的方式影响a
和b
Chrome控制台的结构:
两个对象的原型链中都有城市
和obj
。但是,如果您执行a.city=“American”
操作,您将在a
本身上创建一个新的属性city
,将属性city
隐藏在属性链中。
指定给属性将(几乎)始终在对象本身上创建该属性
a.obj.age=20但是,code>读取(不指定!)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