javascript中prototype方式面向对象编程注意事项
来源:互联网 发布:淘宝天猫积分怎么兑换 编辑:程序博客网 时间:2024/05/24 15:42
原文地址:http://www.hoverlees.com/blog/?p=1193
javascript的prototype在新对象创建时会复制这个类的prototype到新的实例,但要注意,它不会完全复制值是对象的属性,而是复制对象的指针。另一方面,这样可以达到面象对象中的静态变量效果。
如下面的示例代码所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
function
A(num){
this
.num=num;
this
.inner.instanceNum++;
}
A.prototype={
num:0,
inner:{
instanceNum:0,
invokeNum:0
},
setNum:
function
(num){
this
.num=num;
this
.inner.invokeNum++;
},
toString:
function
(){
return
"Num:"
+
this
.num+
" instanceNum:"
+
this
.inner.instanceNum+
" setNum:"
+
this
.inner.invokeNum;
}
};
var
a=
new
A(10);
var
b=
new
A(20);
var
c=
new
A(30);
a.setNum(100);
b.setNum(200);
b.setNum(200);
c.setNum(300);
c.setNum(300);
c.setNum(300);
alert(a);
alert(b);
alert(c);
这段代码咋一看,执行完成后所有对象inner.instanceNum都应该等于1,a的inner.invokeNum=1,b的是2,c的是3
而程序的真正输出是
Num:100 instanceNum:3 setNum:6
Num:200 instanceNum:3 setNum:6
Num:300 instanceNum:3 setNum:6
所以如果使用prototype方式的面向对象编程,在原型的定义里,属性的值不能是对象,否则它相当于标准面象对象里的静态变量了(但这正好是js的静态变量定义方式呢)
正确的方式应该是在构造函数里声明对象,如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
function
A(num){
this
.num=num;
this
.inner={
instanceNum:0,
invokeNum:0
};
this
.inner.instanceNum++;
}
A.prototype={
num:0,
inner:
null
,
setNum:
function
(num){
this
.num=num;
this
.inner.invokeNum++;
},
toString:
function
(){
return
"Num:"
+
this
.num+
" instanceNum:"
+
this
.inner.instanceNum+
" setNum:"
+
this
.inner.invokeNum;
}
};
var
a=
new
A(10);
var
b=
new
A(20);
var
c=
new
A(30);
a.setNum(100);
b.setNum(200);
b.setNum(200);
c.setNum(300);
c.setNum(300);
c.setNum(300);
alert(a);
alert(b);
alert(c);
0 0
- javascript中prototype方式面向对象编程注意事项
- JavaScript面向对象编程之prototype对象
- javaScript中面向对象和原形prototype
- JavaScript [面向对象] prototype
- javascript面向对象编程方式
- JavaScript面向对象编程之prototype原型与继承
- JavaScript面向对象编程(3)prototype简介
- JavaScript面向对象编程(7)只继承prototype
- javascript中面向对象编程
- Javascript中面向对象编程
- javascript [面向对象] prototype 分析
- javaScript 面向对象-原形prototype
- JavaScript面向对象编程(继承实现方式)
- js面向对象编程-prototype
- javascript 面向对象角度中对prototype的理解
- JavaScript中面向对象的编程方法
- JavaScript中如何实现面向对象编程
- javascript中模拟面向对象编程
- Topcoder SRM 648 Div.2 - A(水), B(枚举),C(DP/构造)
- Pascal's Triangle
- Uber 快的 滴滴
- 【转】php,asp与jsp的区别
- superfish的应用
- javascript中prototype方式面向对象编程注意事项
- 初创互联网团队如何利用开源技术和云服务快速建立网站
- 完美解决android scrollview嵌套listview
- linux实操常用命令总结
- blog其实是一种理性思维和表达能力的训练
- 海外优秀资讯抢先看8 - Windows 10 for Raspberry Pi 2
- 面试题4 替换空格
- 滑轮控件研究二、GestureDetector的深入研究
- codeforces 453B Little Pony and Harmony Chest (离散化+dp状态压缩)