日期:2014-05-16 浏览次数:21595 次
function show(s) { document.write(s + "<br/>"); } //定义一个类型 ClassA, function ClassA() { this.a=[]; } //定义一个类型 ClassB function ClassB() { this.b = function() { alert("ClassB");}; } //ClassB 以 ClassA 的对象为原型 ClassB.prototype = new ClassA(); //创建两个 ClassB 类型的对象 var ojb1 = new ClassB(); var ojb2 = new ClassB();
------解决方案--------------------
不等价,一种是给ojb1创建属性并赋值。上面原型的方式是通过原型链查找到的属性a,并没有给ojb1添加属性。
而如果直接ojb1.a="高手" 这样做的话他不是给原型链找到的值赋值,而是新建一个属性给ojb1。从而查找的时候直接找到这个对象的a,相当于覆盖了原型链的a。
至于什么是原型和原型链,请看看下面
http://www.csser.com/dev/52.html
------解决方案--------------------
我说说我的理解吧
准备几个概念,引用类型值和原始类型值
我们知道var i = 1;申明的是变量i,且其值为原始值1,而var i = {}申明的是值为{}的引用对象,即i中存储的是{}对象的内存地址的指针引用。
那么我们再来看上面的代码:
function show(s) { document.write(s + "<br/>"); } //定义一个类型 ClassA, function ClassA() { this.a=[]; } //定义一个类型 ClassB function ClassB() { this.b = function() { alert("ClassB");}; } //ClassB 以 ClassA 的对象为原型 ClassB.prototype = new ClassA(); //创建两个 ClassB 类型的对象 var ojb1 = new ClassB(); var ojb2 = new ClassB(); // ojb1.a.push("牛","人");//调用数组的原型方法 show(ojb2.a);
------解决方案--------------------
弄清楚基本类型的值传递和对象的引用传递,你就觉得你的问题不再是问题了。。
------解决方案--------------------
3楼的问题,当a为数组时,它在原型中存放的是数组的内存地址。而当你根据原型链给他改变时,数组指向的内容改变了,而地址并没有改变!所以根据ojb1和ojb2获取出来的内容一样,就像类C语言函数中你传入值类型和存入地址(或叫引用类型)的区别一样。
------解决方案--------------------
不好意思,之前看错了。
valueOf方法是Object的prototype方法。而你用in来查找会检索原型链中所有的属性(Site的Prototype最终也指向Object的prototype),直到最顶层,亦即是Object的prototype(所有类型的prototype最终指向Object的prototype)。
而你上面for循环只是遍历Site的prototype,而没有进行原型链上的搜索。
你想看更具体的,请看以下文章。
http://www.cnblogs.com/RicCC/archive/2008/02/15/JavaScript-Object-Model-Execution-Model.html
希望对你有帮助
------解决方案--------------------
__proto__属于对象,prototype属于你定义的类型,而你定义的类型又是一个对象,所以你定义的类型既有__proto__,又有prototype。慢慢参详那篇文章吧,不是一两次能看懂的。
------解决方案--------------------
<script type="text/javascript"> function show(s) { document.write(s + "<br/>"); } //定义一个类型 ClassA, function ClassA() { this.a=[]; } //定义一个类型 ClassB function ClassB() { this.b = function() { alert("ClassB");}; //加上这一行代码 ClassA.call(this); } //ClassB 以 ClassA 的对象为原型 ClassB.prototype = new ClassA(); //创建两个 ClassB 类型的对象 var ojb1 = new ClassB(); var ojb2 = new ClassB(); // ojb1.a.push("牛","人"); show("ojb2中a的值:"+ojb2.a); show("ojb1中a的值:"+ojb1.a); </script>
------解决方案--------------------
居然还在纠结,你的问题在于对象的引用传递问题,并非在prototype上面,当然你得先清楚prototype的原理才会知道这问题是在于对象的传递上。。关于prototype的原理网上一搜一大箩,自己google吧。。
值传递的问题,我举个最简单的例子
var arr = [], a = arr, b = arr; a.push('a_push'); alert(b);
------解决方案--------------------
__proto__和prototype需要你认真看之前的文章,我觉得我也说得很通俗了。。。
至于 apply 和 call 你可以看看这文章
http://a48121905.blog.163.com/blog/static/187490265201110305295715/