小弟刚学Javascript不久,最近看书遇到一个问题,有些疑问
我创建了一个构造函数
function Person() {}
Person.prototype = {
name:"aaa",
array:["a","b","c"],
}然后实例化两个对象
var person1 = new Person();
var person2 = new Person();person1.name = "bbb";
alert(person1.name) //"bbb",书上说这个会覆盖原型中的name
person1.array.push("d");
alert(person1.array);//"a,b,c,d",这里有些不理解,前面说新创建的相同属性会覆盖原型,但是这里为什么没有呢?我试了一下,
person1.array = new Array();
person1.array.push("m");
alert(person1.array);//"m",这里得到了想要的结果是不是person1.name是一个副本,所以修改以后可以覆盖原型中的属性,而person1.array是原型属性的一个引用而非副本,所以修改以后原型中的也被修改了?请问大侠们,我这样分析是否正确?多谢各位帮助~~~
我创建了一个构造函数
function Person() {}
Person.prototype = {
name:"aaa",
array:["a","b","c"],
}然后实例化两个对象
var person1 = new Person();
var person2 = new Person();person1.name = "bbb";
alert(person1.name) //"bbb",书上说这个会覆盖原型中的name
person1.array.push("d");
alert(person1.array);//"a,b,c,d",这里有些不理解,前面说新创建的相同属性会覆盖原型,但是这里为什么没有呢?我试了一下,
person1.array = new Array();
person1.array.push("m");
alert(person1.array);//"m",这里得到了想要的结果是不是person1.name是一个副本,所以修改以后可以覆盖原型中的属性,而person1.array是原型属性的一个引用而非副本,所以修改以后原型中的也被修改了?请问大侠们,我这样分析是否正确?多谢各位帮助~~~
解决方案 »
- 如何点击图片引发查询action
- 大伙好!跪求jquery基础教程。
- 如何取得js对象名称
- 要写两个带行号的textarea,求教如何实现滚动条的同步滚动...
- 正则表达式,怎么在匹配一个英语句子时区分英语句号.和小数点.?
- 如何用javascript去除全角空格
- 请问JS能获取HTTP头么?
- 如果获得网页中元素在浏览器中的位置? 急~~ 在线等待~~
- 100分请教大家两个问题~!!!问题解决后我会立刻结帐~~~!!!
- 好友列表怎样实现点击每个分组都可以显示或隐藏分组?
- Javascript(Jquery也可以)判断多个下拉框的值是否重复 orz求助帖
- IE8下如何实现指定窗口前置或者状态栏闪烁
alert(person1.array);//"a,b,c,d",这里有些不理解,前面说新创建的相同属性会覆盖原型,但是这里为什么没有呢?请问 那你认为应该是打印出什么值呢。
你如果
person1.array="d";
那自然覆盖了。
你应该做的是了解下Array push的用法
如果
alert(person2.array); 这里也输出"a,b,c,d"
就是修改了person1的实例,person2的实例也受影响了
Person.prototype.arr = [1,2,3];
var b = {
arr = Person.prototype.arr;
};
var c = {
arr = Person.prototype.arr;
};
b.arr.push(5);
alert(c.arr);new 的实际操作是从函数的prototype上拷贝一份添加到新对象上。
这里有解释其中关于原型链的解释还有待考究。
对于Array、Function、Object等类型的拷贝,实际上是拷贝的地址,而不是创建一个新的。
如果需要初始化的属性如果是按地址传递的,那么就在构造函数内部创建吧。function Person(){
this.arr = [];
};